在Ruby中,只有块可以是闭包,类体(以及模块和方法体)不能是闭包。或者换句话说:只有块创建了一个新的嵌套词法范围,所有其他的(模块体、类体、方法体和脚本体)都创建了新的顶层范围。
所以,你需要一个街区。通常,这意味着使用某种形式的
eval
,但在这里您可以使用
define_singleton_method
相反:
class TestingSingletonMethodsWithVariable
METHODS = %w(a b c d)
def initialize(favorite_method)
METHODS.each do |method_name|
if favorite_method == method_name
define_singleton_method method_name do
puts "#{method_name} its my favorite method"
end
else
define_singleton_method method_name do
puts "#{method_name} its not my favorite method"
end
end
end
end
end
t = TestingSingletonMethodsWithVariable.new('b')
t.a
t.b
t.c
t.d