Динамично определенные методы установщика с помощью define_method?

Я использую много повторений для определения удобных методов в моих моделях, материале как:

PET_NAMES.each do |pn|
define_method(pn) do
...
...
end

но я никогда не мог динамично определить методы установщика, т.е.:

def pet_name=(name)
...
end

использование define_method как так:

define_method("pet_name=(name)") do
...
end

Какие-либо идеи?Заранее спасибо.

15
задан nicosuria 23 March 2010 в 10:55
поделиться

1 ответ

Вот довольно полный пример использования 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 .

40
ответ дан 1 December 2019 в 00:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: