2017-02-21 73 views
5

我遇到了一個奇怪的事情,在Ruby中做簡單的任務。我只想重複與每種方法的字母,但迭代先行在執行:爲什麼Ruby的每個迭代器在執行中首先執行?

alfawit = ("a".."z") 
puts "That's an alphabet: \n\n #{ alfawit.each { |litera| puts litera } } " 

這個代碼的結果是:(略)

a 
b 
c 
⋮ 
x 
y 
z 
That's an alphabet: 

a..z 

任何想法,爲什麼它的工作原理是這或什麼應該是我做錯了?

在此先感謝。

+0

什麼是你預期的結果? – Stefan

+0

在「這是一個字母表」之後列出字母表,就像Ursus正確完成的那樣。我曾認爲我能夠按照自己的方式嵌套迭代。 – Michalko

回答

5

因爲您的each調用是在您的字符串文本中進行插值的,所以在固定字符串之前執行。另外,each返回一個Enumerable,實際上你甚至可以打印。試試這個

alfawit = ("a".."z") 
puts "That's an alphabet: \n\n" 
alfawit.each { |litera| puts litera } 

puts "That's an alphabet: \n\n" 
("a".."z").each { |litera| puts litera } 

你可以使用插值但如果你想用這種方式

alfawit = ("a".."z") 
puts "That's an alphabet: \n\n#{alfawit.to_a.join("\n")}" 
+1

謝謝。我很努力地理解這幾天,但那非常簡單。 – Michalko

+1

我的榮幸爵士:) – Ursus

3

你可以很容易地看到發生了什麼事情,如果你提取插值部分成一個變量:

alfawit = ("a".."z") 
foo = alfawit.each { |litera| puts litera } 
puts "That's an alphabet: \n\n #{ foo } " 

第二行導致出現問題:each爲該範圍內的每個元素調用塊,然後返回接收方,以使foo變爲alfawit

這裏的另一種方式來獲得期望的結果:

alfawit = "a".."z" 
puts "That's an alphabet:", alfawit.to_a 

puts輸出一個新行各的說法,但對於數組參數,它在新行各元素輸出。結果:

That's an alphabet: 
a 
b 
c 
⋮ 
x 
y 
z 

同樣,你可以把範圍爲argument list通過*

alfawit = "a".."z" 
puts "That's an alphabet:", *alfawit 

這相當於:

puts "That's an alphabet:", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" 
相關問題