我無法弄清楚這是誰主要在C工作的人。範圍在Ruby中如何工作?
以下代碼是如何合理的?
if true
hi = "hello"
end
puts hi
我已經習慣了hi
在puts
的範圍不是,所以它會報錯。 Ruby中的作用域如何工作。我似乎無法找到一個清楚的教程解釋它。
即使這是有效的,這是否是好的做法?
我無法弄清楚這是誰主要在C工作的人。範圍在Ruby中如何工作?
以下代碼是如何合理的?
if true
hi = "hello"
end
puts hi
我已經習慣了hi
在puts
的範圍不是,所以它會報錯。 Ruby中的作用域如何工作。我似乎無法找到一個清楚的教程解釋它。
即使這是有效的,這是否是好的做法?
在Ruby中,有5米的範圍:
塊範圍巢,其他人不。塊可以關閉他們的詞彙環境,其他人不能。 (IOW:它們不僅嵌套在他們的詞彙周圍環境中,即可以從其詞彙周圍環境訪問變量,甚至可以在周圍環境不存在後繼續這樣做)。
與其他語言不同,Ruby沒有局部變量的頂級或全局作用域。 「最大」範圍是腳本範圍,但這不是全局範圍,它僅限於一個腳本。 (通常,腳本與文件相同,但有些Ruby實現不使用文件,所以像「文件範圍」這樣的術語會引起誤解。)
局部變量是從其中它們的定義是點定義解析,並從點初始化對它們的定義是執行。在之間,當它們被定義但未初始化時,它們評估爲nil
。
考慮這個稍微修改例如:
if false
hi = 'hello'
end
hi
# => nil
# hi is defined here, because its definition was parsed
if true
hi = 'olleh'
end
hi
# => 'olleh'
# hi is initialized here, because its definition was executed
在Ruby中,我們有4個領域 -
def
創建一個新的範圍class
創建一個新的範圍module
創建一個新的範圍。在你的情況hi
是已在頂層範圍創建了一個局部變量。正如我上面所說的if
不會創建一個新的範圍,所以它使用的默認範圍是頂級範圍,並且hi
是在頂級範圍中創建的。
實施例:
foo = 12
def baz
p foo # undefined local variable or method `foo'
bar = 2
end
bar # undefined local variable or method `bar'
作爲def
baz
內創建一個完全嶄新的範圍,從而,該範圍不知道關於foo
和它的對象。同樣的,在baz
裏面,我創建了一個新的變量bar
,但是它不知道baz
的範圍,因此頂層也是反對bar
的對象。
塊創建一個新的範圍,以及 – freedrull
所以是最高級別範圍可全部通過'def'?如果我在任何地方創建一個變量,即使在深度嵌套的if循環樹中,它也可以在其外部使用嗎? – user212541
@ user212541沒有'def'創建一個新的範圍,這是一個全新的,與頂層不同的範圍。對於你的第二個問題,是的。 –