为什么Ruby每个迭代器在执行中首先进行



我遇到了在Ruby中做简单任务的奇怪的事情。我只想用每种方法迭代字母表,但是迭代在执行中首先进行:

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

此代码导致了这一点:(缩写)

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

有什么想法为什么它这样起作用,或者我据说我做错了什么?

预先感谢。

,因为您的each调用在固定字符串之前执行的字符串文字插值。另外,each返回Enumerable,实际上您即使打印。尝试这个

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

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

如果需要,可以使用插值,但是以这种方式

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

如果将插值部分提取到变量:

alfawit = ("a".."z")
foo = alfawit.each { |litera| puts litera }
puts "That's an alphabet: nn #{ 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

同样,您可以通过*将范围变成参数列表:

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"

最新更新