2009-10-06 56 views
8

如何將obj轉換回名爲obj的變量在def中?Ruby - 將符號轉換爲變量

def foo(bar) 
    bar.some_method_call 
end 

foo :obj 

UPDATE: 最後的代碼比這更復雜,但...

我希望能夠說

foo :obj 

,而不是

foo obj 

我正在研究一些類似DSL的語法。而這一改變會讓事情更清楚一點。

+0

這是否意味着你的符號,裏面帶所示,直接對應的實例變量? – Matt 2009-10-06 17:56:33

回答

0

你幾乎肯定不能。該定義將無法訪問調用作用域的局部變量。如果你想更全面地解釋你想要做的事情,我們可能會提供一個有用的選擇。

+0

查看更新和評論 – BuddyJoe 2009-10-06 19:51:29

11

你的例子中obj是什麼類型的變量?如果它是調用foo的作用域的局部變量,則不能從foo內部訪問它,除非您將當前綁定作爲第二個參數傳遞。

如果您要訪問的實例變量@obj,很容易:

def foo(bar) 
    instance_variable_get("@#{bar}").length 
end 

@obj = "lala" 
foo("obj") #=> 4 
+0

obj不在foo的範圍之內。 +1好信息 – BuddyJoe 2009-10-06 19:50:37

1

你的意思是變量或訪問方法? Sepp2k給出了一個實例變量的名稱;對於訪問使用

def foo(bar) 
    self.send(bar).some_method_call 
end 
4

你可以使用eval

def foo(bar) 
    eval(bar.to_s).some_method_call 
end 
3

這是一個有點古怪,但如果你願意傳遞一個空塊(或者,如果你反正路過一人),就可以得到從塊的結合,然後調用eval並通過結合:

def foo(symbol, &block) 
    binding = block.send(:binding) 

    eval(symbol.to_s, binding) 
end 

var = 3 

puts foo(:var) {} 

這將打印3.

或者,ActiveSupport顯然有一些名爲Binding.of_caller的東西,您可能可以使用,因此您不必通過該塊,但我不知道它的工作效果如何。

另一種方法是調用foo並通過在綁定:

def foo(binding, symbol) 
    eval(symbol.to_s, binding) 
end 

binding = self.send(:binding) 
var = 3 

puts foo(binding, :var)