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

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

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

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

 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设置为5
 @quux设置为10

你很接近,但是你不想在调用 define_method的参数中包含方法的参数。 参数在您传递给define_method的块中。

如果你在一个类/模块中需要它,那就太好了:我使用hash但是你可以放置一些元素等等。

 PETS = { "cat" => "meyow", "cow" => "moo", "dog" => "ruff" } def do_smth1(v) ... end def do_smth(sound,v) ... end #getter PETS.each{ |k,v| define_method(k){ do_smth1(v) } } #setter PETS.each{ |k,v| define_method("#{k}="){|sound| do_smth2(sound, v) }