Ruby类估值与收益率
老兄,我今天正在剥洋葱皮,不管怎样,代码是这样的Ruby类估值与收益率,ruby,Ruby,老兄,我今天正在剥洋葱皮,不管怎样,代码是这样的 class MyClass def initialize(dynamic_methods) @arr = Array.new(dynamic_methods) @arr.each { |m| self.class.class_eval do define_method(m) do "<#{yield self if block_given?}>" e
class MyClass
def initialize(dynamic_methods)
@arr = Array.new(dynamic_methods)
@arr.each { |m|
self.class.class_eval do
define_method(m) do
"<#{yield self if block_given?}>"
end
end
}
end
end
tmp = MyClass.new ['method1', 'method2', 'method3']
tmp.method1 do |t|
"here"
end
有人能帮我解释一下语法吗?提前感谢你的帮助
更新:请参阅下面的答案。尝试更换
define_method(m) do
"<#{yield self if block_given?}>"
end
在Sergei的大量反馈和我自己的一些修补之后,我成功地让它工作起来
class MyClass
def initialize(dynamic_methods)
@arr = Array.new(dynamic_methods)
@arr.each { |m|
self.class.module_eval %Q{
def #{m}(&block)
yield(self) if block_given?
end
end
}
end
end
tmp = MyClass.new ['method1', 'method2', 'method3']
tmp.method1 do |t|
"here"
end
正如您所知,Sergei的建议有一些小的调整,因此感谢您对Sergei的帮助。很遗憾,您是对的,我在1.8.6上,它在&block上出现了barfed(语法错误)。在这种情况下,您可能会屈服于
module_eval
,它需要一个字符串:module_eval%Q{def#{m}(&block)”end}很抱歉,这也导致了一个错误,这次是“未定义的局部变量或方法'block'”正确,您需要转义内部'#',这样它就不会立即得到计算。请看我更新的答案。这太令人恼火了,现在它有一个错误“警告:一个块参数有多个值(0代表1)”。也谢谢你几次来帮助我。
define_method(m) do |&block|
"<#{block.call if block}>"
end
self.class.module_eval %Q{
def #{m}(&block)
"<\#{block.call if block}>"
end
}
class MyClass
def initialize(dynamic_methods)
@arr = Array.new(dynamic_methods)
@arr.each { |m|
self.class.module_eval %Q{
def #{m}(&block)
yield(self) if block_given?
end
end
}
end
end
tmp = MyClass.new ['method1', 'method2', 'method3']
tmp.method1 do |t|
"here"
end