我做了一些(太)花哨的元編程,我也很難理解爲什麼範圍是在以下兩種情況下的不同:爲什麼我的define_method內容在類作用域中被評估?
案例1:
class TesterA
def the_method
puts "I'm an instance_method!"
end
def self.the_method
puts "I'm a class_method!"
end
def self.define_my_methods *method_names
method_names.each do |name|
define_method("method_#{name}") do
the_method
end
end
end
define_my_methods :a, :b, :c
end
t = TesterA.new
t.method_a #=> I'm an instance_method!
t.method_b #=> I'm an instance_method!
t.method_C#=> I'm an instance_method!
案例2
class TesterB
def the_method
puts "I'm an instance_method!"
end
def self.the_method
puts "I'm a class_method!"
end
def self.define_the_method attr
define_method("method_#{attr}") do
begin
yield
rescue
raise $!, "method_#{attr} was called: #$!", [email protected]
end
end
end
def self.define_my_methods *method_names
method_names.each do |name|
define_the_method(name) do
the_method
end
end
end
define_my_methods :a, :b, :c
end
t = TesterB.new
t.method_a #=> I'm a class_method!
t.method_b #=> I'm a class_method!
t.method_C#=> I'm a class_method!
I I介紹了一種「輔助-評判」 define_the_method
我使用用於限定米第二示例方法而不是define_method
它自己。原因是,我想將動態方法的名稱附加到可能在這些方法內發生的任何異常消息。然而,問題在於,內容(使用後一種情況時)似乎是在類範圍內進行評估的。
這是爲什麼,我該如何讓它在實例範圍內得到評估?
我喜歡這個!然而,在我的真實世界用例中,我需要能夠將方法傳遞給方法,所以我最終只使用'instance_exec'來代替。謝謝你的提示! –