219

我正在阅读一本书,其中给出了使用“to_a”方法将范围转换为等效数组的示例

当我在 irb 中运行代码时,我收到以下警告

 warning: default `to_a' will be obsolete

使用 to_a 的正确替代方法是什么?

是否有其他方法可以使用 Range 填充数组?

4

6 回答 6

390

您可以使用 splat 创建具有范围的数组,

>> a=*(1..10)
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

使用Kernel Array方法,

Array (1..10)
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

或使用 to_a

(1..10).to_a
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
于 2011-07-05T18:22:15.647 回答
82

这在 irb 中对我有用:

irb> (1..4).to_a
=> [1, 2, 3, 4]

我注意到:

irb> 1..4.to_a
(irb):1: warning: default `to_a' will be obsolete
ArgumentError: bad value for range
        from (irb):1

所以也许你错过了括号?

(我正在运行 Ruby 1.8.6 补丁级别 114)

于 2008-10-10T13:49:55.297 回答
36

听起来你正在这样做:

0..10.to_a

警告来自 Fixnum#to_a,而不是来自 Range#to_a。试试这个:

(0..10).to_a
于 2008-10-10T13:52:40.847 回答
10

检查这个:

a = [*(1..10), :top, *10.downto( 1 )]
于 2013-06-12T04:25:55.383 回答
7

这是另一种方式:

irb> [*1..10]

=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
于 2018-02-27T13:19:52.870 回答
5

我只是尝试使用从大到小的范围,得到了我没想到的结果:

irb(main):007:0> Array(1..5)
=> [1, 2, 3, 4, 5]
irb(main):008:0> Array(5..1)
=> []

那是因为范围实现。
所以我不得不使用以下选项:

(1..5).to_a.reverse
于 2013-04-16T13:35:32.727 回答