ruby-on-rails – 使用define_method动态定义的setter方法?

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 使用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 was set to 5
@quux was set to 10

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

猜你在找的Ruby相关文章