使用define_method动态定义的setter方法?

nic*_*ria 15 ruby activerecord metaprogramming ruby-on-rails

我使用了大量的迭代来定义模型中的便捷方法,例如:

PET_NAMES.each do |pn|
define_method(pn) do
...
...
end
Run Code Online (Sandbox Code Playgroud)

但我从来没能动态定义setter方法,即:

def pet_name=(name)
...
end
Run Code Online (Sandbox Code Playgroud)

像这样使用define_method:

define_method("pet_name=(name)") do
...
end
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?提前致谢.

Mar*_*off 40

这是一个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
Run Code Online (Sandbox Code Playgroud)

输出:

@bar was set to 5
@quux was set to 10

你接近,但你不希望在你的论据里面方法的参数调用define_method.参数在你传递给的块中define_method.