2014-04-22 21 views
0

我無法弄清楚這是誰主要在C工作的人。範圍在Ruby中如何工作?

以下代碼是如何合理的?

if true 
    hi = "hello" 
end 

puts hi 

我已經習慣了hiputs的範圍不是,所以它會報錯。 Ruby中的作用域如何工作。我似乎無法找到一個清楚的教程解釋它。

即使這是有效的,這是否是好的做法?

回答

6

在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 
1

在Ruby中,我們有4個領域 -

  1. 頂層範圍
  2. def創建一個新的範圍
  3. class創建一個新的範圍
  4. 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' 

作爲defbaz內創建一個完全嶄新的範圍,從而,該範圍不知道關於foo和它的對象。同樣的,在baz裏面,我創建了一個新的變量bar,但是它不知道baz的範圍,因此頂層也是反對bar的對象。

+0

塊創建一個新的範圍,以及 – freedrull

+0

所以是最高級別範圍可全部通過'def'?如果我在任何地方創建一個變量,即使在深度嵌套的if循環樹中,它也可以在其外部使用嗎? – user212541

+0

@ user212541沒有'def'創建一個新的範圍,這是一個全新的,與頂層不同的範圍。對於你的第二個問題,是的。 –