我遇到了在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"