2016-02-29 207 views
1

使用此示例:對於循環變量範圍

arr = [1, 2, 3] 

for elem in arr do 
    puts elem 
end 

puts elem # => 3 

代碼輸出:

1 
2 
3 
3 

elem包含連外循環的值。爲什麼?循環之外的範圍是什麼?

請問誰能澄清?

+0

自從循環引入範圍時? – hek2mgl

+0

變量'elem'是否有範圍? –

+1

'for'在Ruby代碼中不推薦使用,因爲它泄露了中間變量。相反,我們使用'each'或'upto'或'count'來迭代。 –

回答

8

這是預期的。按照documentation

for循環類似於使用each,但不創建一個新的變量範圍。

實例與 for

for i in 1..3 
end 
i #=> 3 

例與each

(1..3).each do |i| 
end 
i #=> NameError: undefined local variable or method `i' 

如果我沒有記錯,方法eachmaploopupto)創建變量的作用域,而關鍵字for,while,until)不。

0

你可以在循環範圍外聲明你的變量elem。因此,如果我們修改您的示例:

arr = [1, 2, 3]; 
elem; 

for elem in arr do 
    puts elem 
end 

puts elem # => 3 
2

for語句定義變量elem並使用當前循環的值對其進行初始化。

要避免這一點Array#each

arr.each do |elem| 
    puts elem 
end 
# 1 
# 2 
# 3 
# => [1, 2, 3] 
elem 
NameError: undefined local variable or method `elem' for main:Object 
    from (irb):5 
    from /usr/bin/irb:12:in `<main>' 

現在ELEM變量僅在塊存在。