2017-02-21 50 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" 
相关问题