Динамически определенные методы установки, использующие define_method? - PullRequest
14 голосов
/ 23 марта 2010

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

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

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

def pet_name=(name)
...
end

используя define_method примерно так:

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

Есть идеи? Заранее спасибо.

Ответы [ 2 ]

38 голосов
/ 23 марта 2010

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

1 голос
/ 07 июля 2014

Потрясающе, если вам это нужно внутри одного класса / модуля: я использую хеш, но вы можете поместить туда множество элементов и т. Д.

...