2010-04-10 4 views
3

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!

Répondre

1

Ce n'est pas ce que vous demandez, mais si Foo devait inclure M, cela vous permettrait-il de réaliser ce que vous recherchez? par exemple.

module M 
    def do_something 
    puts "I am going to use the test method from the including class" 
    test 
    end 
end 

class Foo 
    include M 
    def test 
    puts "In Foo's test method" 
    end 

    def do_stuff 
    do_something 
    end 
end 

et vous pouvez le faire:

irb(main):019:0> Foo.new.do_stuff 
I am going to use the test method from the including class 
In Foo's test method 

Si l'idée est d'avoir un module fournir des fonctionnalités générales et ont les spécificités d'une classe alors c'est un modèle assez courant en rubis, par exemple le module Comparable nécessitant la classe include pour implémenter <=>.

+0

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

+0

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

+0

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

5

Entré à travers ce poste tout en cherchant une réponse à mes propres fins. N'a pas trouvé celui qui était approprié, alors j'ai creusé à travers la source de Ruby et mis en place une extension. Je l'ai empaqueté comme un GEM- devrait installer sans aucun problème tant que vous utilisez Ruby 1.9.1:

sudo gem install expéditeur

Ce ne fonctionnera pas avec Ruby 1.8 , comme 1.8 a un modèle différent pour le suivi des images.

http://rubygems.org/gems/sender