我正在编写一本书,其中给出了使用"to_a"方法将Ranges转换为等效数组的示例
当我在irb中运行代码时,我收到以下警告
warning: default `to_a' will be obsolete
Run Code Online (Sandbox Code Playgroud)
使用to_a的正确替代方法是什么?
有没有其他方法用Range填充数组?
Zam*_*ith 338
您可以使用splat创建一个带有范围的数组,
>> a=*(1..10)
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Run Code Online (Sandbox Code Playgroud)
使用Kernel Array方法,
Array (1..10)
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Run Code Online (Sandbox Code Playgroud)
或使用to_a
(1..10).to_a
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Run Code Online (Sandbox Code Playgroud)
Dan*_*aft 79
这对我来说非常有用:
irb> (1..4).to_a
=> [1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)
我注意到:
irb> 1..4.to_a
(irb):1: warning: default `to_a' will be obsolete
ArgumentError: bad value for range
from (irb):1
Run Code Online (Sandbox Code Playgroud)
也许你错过了括号?
(我正在运行Ruby 1.8.6 patchlevel 114)
Ric*_*ner 34
听起来像你这样做:
0..10.to_a
Run Code Online (Sandbox Code Playgroud)
警告来自Fixnum#to_a,而不是来自Range#to_a.试试这个:
(0..10).to_a
Run Code Online (Sandbox Code Playgroud)
检查一下:
a = [*(1..10), :top, *10.downto( 1 )]
Run Code Online (Sandbox Code Playgroud)
小智 7
这是另一种方式:
irb> [*1..10]
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Run Code Online (Sandbox Code Playgroud)
我只是尝试使用从大到小的范围,得到了我没想到的结果:
irb(main):007:0> Array(1..5)
=> [1, 2, 3, 4, 5]
irb(main):008:0> Array(5..1)
=> []
Run Code Online (Sandbox Code Playgroud)
那是因为范围实现。
所以我不得不使用以下选项:
(1..5).to_a.reverse
Run Code Online (Sandbox Code Playgroud)