使用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) }