nic*_*ria 15 ruby activerecord metaprogramming ruby-on-rails
我使用了大量的迭代来定义模型中的便捷方法,例如:
PET_NAMES.each do |pn|
define_method(pn) do
...
...
end
Run Code Online (Sandbox Code Playgroud)
但我从来没能动态定义setter方法,即:
def pet_name=(name)
...
end
Run Code Online (Sandbox Code Playgroud)
像这样使用define_method:
define_method("pet_name=(name)") do
...
end
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?提前致谢.
Mar*_*off 40
这是一个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
Run Code Online (Sandbox Code Playgroud)
输出:
@bar was set to 5 @quux was set to 10
你接近,但你不希望在你的论据里面方法的参数调用到define_method.参数在你传递给的块中define_method.
| 归档时间: |
|
| 查看次数: |
9576 次 |
| 最近记录: |