7

我正在尝试使用以下代码打印 1 到 50 之间的所有数字:

[1..50].each{|n|   puts n}

但控制台打印

 [1..50] 

我想打印这样的东西 1 2 3 4 ... 50

4

4 回答 4

16

试试下面的代码:

(1..50).each { |n| puts n }

问题是您使用的是[]分隔符而不是分隔符()

于 2013-01-25T18:58:50.083 回答
9

您可以[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"

得到你想要的输出。

于 2013-01-25T19:11:18.003 回答
8

这里的错误是您正在创建一个以范围作为唯一元素的 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 }
于 2013-01-25T19:06:09.417 回答
3

您可以将您的范围(在括号中)转换为一个数组([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
于 2013-01-25T19:13:26.087 回答