2011-07-05 6 views
4

Dans Ruby, vous pouvez facilement accéder aux variables locales par programmation en utilisant local_variables et eval. Je voudrais vraiment avoir accès méta-programmation à ces variables à l'aide d'un seul appel de méthode telle queAccès aux variables locales à partir d'une liaison différente dans Ruby

# define a variable in this scope, such as 
x = 5 
Foo.explore_locals # inside the Foo#explore_locals method, access x 

Foo est un peu le module externe. L'idée est d'afficher et d'exporter des variables locales d'une manière agréable.

Que devrait contenir la méthode explore_locals? Y a-t-il un moyen de rendre cela possible? Si absolument nécessaire, je suppose que cela pourrait être

Foo.explore_locals binding 

mais c'est beaucoup moins élégant pour l'application que j'ai en tête.

Répondre

1

Il est dommage qu'il n'y ait pas un moyen intégré pour obtenir la liaison de l'appelant. L'astuce de bloc semble être la réponse habituelle à cette question.

Cependant, il existe un autre «truc» qui existait pour les anciennes versions 1.8 Ruby appelées binding_of_caller. On dirait que quix l'a porté à 1.9. Vous voudrez peut-être vérifier cela:

https://github.com/quix/binding_of_caller

1

est un exemple ici (mais il nécessite des accolades supplémentaires {} que je préférerais éviter si possible):

module Foo 
    def self.explore_locals &block 
    p block.binding.eval 'local_variables' 
    end 
end 

local_1 = 3 
Foo.explore_locals{} # shows [:local_1, :_] 
Questions connexes