2011-07-05 66 views
4

在Ruby中,您可以通過使用local_variableseval以編程方式輕鬆訪問局部變量。我真的想使用有一個方法調用,如從Ruby中的不同綁定訪問局部變量

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

其中Foo一些外部模塊對這些變量的元編程訪問。這個想法是以一種很好的方式顯示和導出局部變量。

什麼應該在explore_locals方法裏面?有什麼辦法可以做到這一點嗎?如果絕對必要的,我想這可能是

Foo.explore_locals binding 

但這是我心目中的應用程序優雅的要少得多。

回答

1

這是一個恥辱,沒有內置的方式來獲得主叫方的結合。這個訣竅似乎是這個問題的通常答案。

然而,還存在另一個'技巧',它存在於老的1.8 Ruby版本中,名爲binding_of_caller。看起來像quix將它移植到1.9。你可能想檢查一下:

https://github.com/quix/binding_of_caller

1

下面是一個例子(但它需要額外的括號{}我寧願避免可能的話):

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

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