如何將obj轉換回名爲obj的變量在def中?Ruby - 將符號轉換爲變量
def foo(bar)
bar.some_method_call
end
foo :obj
UPDATE: 最後的代碼比這更復雜,但...
我希望能夠說
foo :obj
,而不是
foo obj
我正在研究一些類似DSL的語法。而這一改變會讓事情更清楚一點。
如何將obj轉換回名爲obj的變量在def中?Ruby - 將符號轉換爲變量
def foo(bar)
bar.some_method_call
end
foo :obj
UPDATE: 最後的代碼比這更復雜,但...
我希望能夠說
foo :obj
,而不是
foo obj
我正在研究一些類似DSL的語法。而這一改變會讓事情更清楚一點。
你幾乎肯定不能。該定義將無法訪問調用作用域的局部變量。如果你想更全面地解釋你想要做的事情,我們可能會提供一個有用的選擇。
查看更新和評論 – BuddyJoe 2009-10-06 19:51:29
你的例子中obj
是什麼類型的變量?如果它是調用foo的作用域的局部變量,則不能從foo內部訪問它,除非您將當前綁定作爲第二個參數傳遞。
如果您要訪問的實例變量@obj
,很容易:
def foo(bar)
instance_variable_get("@#{bar}").length
end
@obj = "lala"
foo("obj") #=> 4
obj不在foo的範圍之內。 +1好信息 – BuddyJoe 2009-10-06 19:50:37
你的意思是變量或訪問方法? Sepp2k給出了一個實例變量的名稱;對於訪問使用
def foo(bar)
self.send(bar).some_method_call
end
你可以使用eval
def foo(bar)
eval(bar.to_s).some_method_call
end
這是一個有點古怪,但如果你願意傳遞一個空塊(或者,如果你反正路過一人),就可以得到從塊的結合,然後調用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)
這是否意味着你的符號,裏面帶所示,直接對應的實例變量? – Matt 2009-10-06 17:56:33