Я использую много повторений для определения удобных методов в моих моделях, материале как:
PET_NAMES.each do |pn|
define_method(pn) do
...
...
end
но я никогда не мог динамично определить методы установщика, т.е.:
def pet_name=(name)
...
end
использование define_method как так:
define_method("pet_name=(name)") do
...
end
Какие-либо идеи?Заранее спасибо.
Вот довольно полный пример использования define_method
в модуле, который вы используете для расширения вашего класса:
module VerboseSetter
def make_verbose_setter(*names)
names.each do |name|
define_method("#{name}=") do |val|
puts "@#{name} was set to #{val}"
instance_variable_set("@#{name}", val)
end
end
end
end
class Foo
extend VerboseSetter
make_verbose_setter :bar, :quux
end
f = Foo.new
f.bar = 5
f.quux = 10
Вывод:
@bar was set to 5 @quux was set to 10
Вы были близки, но вы не хотите включать аргумент метода в аргументы вашего вызова в define_method
. Аргументы попадают в блок, который вы передаете в define_method
.