在Ruby中局部變量只能在它們定義的範圍內訪問。每當你進入/離開一個類,一個模塊或一個方法定義你的範圍在Ruby中改變。
例如:
v1 = 1
class MyClass # SCOPE GATE: entering class
v2 = 2
local_variables # => ["v2"]
def my_method # SCOPE GATE: entering def
v3 = 3
local_variables # => ["v3"]
end # SCOPE GATE: leaving def
local_variables # => ["v2"]
end # SCOPE GATE: leaving class
這些進出點,被稱作範圍蓋茨。由於您通過方法定義通過Scope Gate進入,因此您無法在hello
方法中訪問您的local_var
。
您可以使用Scope Flattening概念將變量傳遞給這些門。
例如,如果不使用def
來定義您的方法,則可以使用Module#define_method
。
local_var = "Hello"
define_method :hello do
puts local_var
end
在你可以定義通過Class#New
你的類,這樣當你通過類定義的範圍不改變以同樣的方式。
local_var = 'test'
MyClass = Class.new do
puts local_var #valid
end
代替
class MyClass
puts local_var #invalid
end
如果您想通過模塊門來傳遞你的局部變量,你應該使用Module#New
以同樣的方式。
實施例從Metaprogramming Ruby
你說過「我一直認爲局部變量不能從[...]函數外部訪問」。那麼,爲什麼你感到驚訝,你的本地變量只在'puts'行的函數內部尋找? – Gareth 2012-03-12 17:15:40
,因爲其他編程語言不同 – shevchyk 2012-03-12 19:36:21
試試@local_var =「你好」 – 2016-01-18 22:56:00