在Ruby中使用Range填充数组的正确方法

Wil*_*ill 189 ruby syntax

我正在编写一本书,其中给出了使用"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)

  • 你对splat的使用是令人讨厌的.更好看的选项是`[*1..10]`. (3认同)
  • Splat选项不适用于Ruby 1.8.7,我建议使用`(1..10).to_a`以实现向后兼容 (2认同)
  • 我使用 splat 的方式也可以与变量一起使用,因此它可以用作 a=*range,它更加一致。但这是一个品味问题。 (2认同)
  • 什么是最快的方法? (2认同)

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)

  • **说明**:没有括号,你从Fixnum类的一个实例(在这种情况下为4)调用to_a方法,而不是在范围1..4上.如果在ruby 1.9.2中运行`Fixnum.methods.include?(to_a)`,你会注意到不再定义to_a方法,因此你在08年获得折旧消息的原因 (7认同)

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)


Bor*_*cky 8

检查一下:

a = [*(1..10), :top, *10.downto( 1 )]
Run Code Online (Sandbox Code Playgroud)

  • *10.downto(1)就是我想要的,谢谢! (2认同)

小智 7

这是另一种方式:

irb> [*1..10]

=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Run Code Online (Sandbox Code Playgroud)


Nic*_*nko 5

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

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)

  • 今天我发现了 `5.downto(1).to_a` 这是另一种表达递减范围的方式 /sf/answers/624890661/ (4认同)