我使用很多迭代来定义我的模型中的方便方法,如:
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 was set to 5 @quux was set to 10
你很近,但是你不想在你调用define_method的参数中包含该方法的参数.参数在你传递给define_method的块中.