que je fais un peu (trop) de fantaisie programmation méta, et j'ai du mal à comprendre pourquoi le champ d'application est différente dans les deux cas suivants:Pourquoi mon contenu define_method est-il évalué dans la portée de la classe?
Cas 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!
Case 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 le deuxième exemple que je vous présente une sorte de "aide-mothod" define_the_method
que j'utilise pour définir la m ethods plutôt que define_method
lui-même. Raison de cela est, Que je veux ajouter le nom de la méthode dynamique à tous les messages d'exception qui pourraient se produire à l'intérieur de ces méthodes. Le problème est cependant, que le contenu (en utilisant ce dernier cas) semble être évalué dans la portée de la classe.
Pourquoi est-ce, et comment puis-je le faire évaluer dans la portée de l'instance?
J'aime celui-ci! Cependant, dans mon cas d'utilisation dans le monde réel, j'ai besoin de pouvoir aussi passer un paramètre aux méthodes, donc j'ai juste fini par utiliser 'instance_exec' à la place. Merci pour le conseil! –