ci-après est mon morceau de code que je veux simplifier afin d'éviter de passer un argument supplémentaire sur chaque appel. En fait, mon utilisation est que M
est une bibliothèque utilisateur sans la définition de context
argument sur chaque méthode. check
est une méthode qui n'est pas définie par l'utilisateur.Comment récupérer l'objet de contexte appelant dans Ruby?
# User code
module M
def do_something(context)
puts "Called from #{context}"
context.check
end
module_function :do_something
end
# Application code
class Bar
def check
puts "Checking from #{self}..."
end
end
class Foo < Bar
def do_stuff(scope, method)
scope.send method, self
end
end
# Executed by user
Foo.new.do_stuff M, :do_something
est-il un moyen de faire de même penser sans passer self
comme argument d'entrée à la méthode do_something
afin de récupérer la méthode check
?
# User code
module M
def do_something
called_from_object = ???
puts "Called from #{called_from_object}"
called_from_object.check
end
module_function :do_something
end
# Application code
class Bar
def check
puts "Checking from #{self}..."
end
end
class Foo < Bar
def do_stuff(scope, method)
scope.send methood
end
end
# Executed by user
Foo.new.do_stuff M, :do_something
Nous vous remercions de votre soutien!
J'ai eu un coup d'oeil sur le module Comparable mais je ne vois pas le lien entre ma question et que le module ... Pouvez-vous aller plus dans les détails? – David
Lorsque le module a été fixé comme un module spécifique (par exemple 'M' dans votre version originale de la question) alors la classe' Foo' pourrait simplement inclure 'M' et quand' do_stuff' appelé le 'do_something' inclus serait l'instance de Foo. Cependant si le module est passé en paramètre do do_stuff (comme dans l'exemple mis à jour) alors je pense que vous aurez besoin d'une approche différente. – mikej
Merci pour ce commentaire, je suis d'accord dans le cas d'un module particulier 'M'. Mon premier message était un cas spécifique qui ne reflétait pas ce que je voulais vraiment faire. – David