动态定义的setter方法使用define_method? [英] Dynamically defined setter methods using define_method?
问题描述
我用了很多迭代来定义我的模型方便的方法,这样的东西:
I use a lot of iterations to define convenience methods in my models, stuff like:
PET_NAMES.each do |pn|
define_method(pn) do
...
...
end
但我从来没有能够动态地定义setter方法,即:
but I've never been able to dynamically define setter methods, ie:
def pet_name=(name)
...
end
使用define_method像这样:
using define_method like so:
define_method("pet_name=(name)") do
...
end
任何想法?先谢谢了。
Any ideas? Thanks in advance.
推荐答案
下面是在你用它来扩展您的类模块使用define_method一个相当完整的例子:
Here's a fairly full example of using define_method in a module that you use to extend your class:
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
。
You were close, but you don't want to include the argument of the method inside the arguments of your call to define_method
. The arguments go in the block you pass to define_method
.
这篇关于动态定义的setter方法使用define_method?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!