我正在尝试使用以下代码打印1到50之间的所有数字:
[1..50].each{|n| puts n}
但控制台打印
[1..50]
我想打印这样的东西 1 2 3 4 ... 50
答案 0 :(得分:13)
请尝试以下代码:
(1..50).each { |n| puts n }
问题是您使用的是[]
分隔符,而不是()
分隔符。
答案 1 :(得分:7)
这里的错误是您正在创建一个Array范围作为唯一元素的Array对象。
> [1..10].size
=> 1
如果要在范围上调用each
之类的方法,则必须将范围包装在括号中,以避免在范围的最后一个元素上调用该方法,而不是在范围本身上调用。
=> (1..10).each { |i| print i }
12345678910
实现同样目的的其他方法:
(1..50).each { |n| print n }
1.up_to(50) { |n| print n }
50.times { |n| print n }
答案 2 :(得分:6)
您可以使用[1..10]
进行小调整:
[*1..10].each{ |i| p i }
输出:
1 2 3 4 5 6 7 8 9 10
*
(AKA“splat”)将范围“爆炸”到其组件中,然后用于填充数组。它与写(1..10).to_a
类似。
你也可以这样做:
puts [*1..10]
打印同样的东西。
所以,试试:
[*1..10].join(' ') # => "1 2 3 4 5 6 7 8 9 10"
或:
[*1..10] * ' ' # => "1 2 3 4 5 6 7 8 9 10"
获得你想要的输出。
答案 3 :(得分:2)
您可以将范围(括号中)转换为数组([1 2 3 4 5 6 ... 48 49 50])并加入每个项目(例如,如果您想要所有项目都加入' '
线)。
puts (1..50).to_a.join(' ')
# => 1 2 3 4 5 6 7 ... 48 49 50