Правильный способ заполнения массива с помощью Range в Ruby - PullRequest
177 голосов
/ 10 октября 2008

Я работаю над книгой, в которой приводятся примеры преобразования диапазонов в эквивалентные массивы с использованием их методов "to_a"

Когда я запускаю код в irb, я получаю следующее предупреждение

 warning: default `to_a' will be obsolete

Какая правильная альтернатива использованию to_a?

существуют ли альтернативные способы заполнения массива Range?

Ответы [ 6 ]

320 голосов
/ 05 июля 2011

Вы можете создать массив с диапазоном, используя 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]
77 голосов
/ 10 октября 2008

Это работает для меня в 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)

33 голосов
/ 10 октября 2008

Похоже, вы делаете это:

0..10.to_a

Предупреждение от Fixnum # to_a, а не от Range # to_a. Попробуйте вместо этого:

(0..10).to_a
8 голосов
/ 12 июня 2013

Проверьте это:

a = [*(1..10), :top, *10.downto( 1 )]
3 голосов
/ 16 апреля 2013

Я просто попытался использовать диапазоны от большего к меньшему количеству и получил результат, которого я не ожидал:

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

Это из-за реализации диапазонов.
Поэтому мне пришлось использовать следующую опцию:

(1..5).to_a.reverse
1 голос
/ 27 февраля 2018

Это еще один способ:

irb> [* 1..10]

=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...