Правильний спосіб заповнити масив з діапазоном у Ruby


201

Я працюю над книгою, яка наводить приклади діапазонів, що перетворюються на еквівалентні масиви, використовуючи їх "to_a" методи

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

 warning: default `to_a' will be obsolete

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

чи є альтернативні способи заселення масиву діапазоном?


7
Великий застереження для перетворення діапазону в масив, це великий діапазон, може зайняти багато пам'яті при створенні масиву, тому використовуйте його з обережністю. Замість того, щоб створювати масив, може бути краще перебирати діапазон, як би ви масив, щоб зменшити споживання пам'яті. Це одна з тих речей, які «застосовують за потребою».
Олов'яний чоловік

Відповіді:


357

Ви можете створити масив з діапазоном за допомогою 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]

1
Що робити, якщо масив уже створений, і ви хочете додати до нього діапазон: у мене є order = 1. Потім order << (2.25).to_a. Але це створює інший масив всередині масиву, я просто хочу діапазон від 2 до 25. Однак, якщо я спробую, order << (2.25)я отримаю помилку, не можу перетворити діапазон у цілий.
kakubei

1
@kakubei використовувати concatзамість <<. Крім того, ви не повинні отримувати "не вдається перетворити діапазон у цілий", якщо orderце ціле число - у цьому випадку ви би змістили біт, а не додавали масив.
Келвін

3
Параметр Splat не працює для Ruby 1.8.7, я б рекомендував використовувати (1..10).to_aдля зворотної сумісності
kylewelsby

5
Ваше використання бризки неприємне. Краще виглядає варіант [*1..10].
Hauleth

2
який найшвидший спосіб ??
Андрій Ясінішин

79

Це працює для мене в 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 patchlevel 114)


7
Пояснення : без дужок ви викликаєте метод to_a з екземпляра класу Fixnum (в даному випадку 4), а не в діапазоні 1..4. Якщо ви працюєте Fixnum.methods.include?(to_a)в рубіні 1.9.2, ви помітите, що метод to_a більше не визначений, отже, чому ви отримали повідомлення про амортизацію в 08
П'єр

@Pierre Я думаю, ти мав на увазіFixnum.instance_methods.include?(:to_a)
Келвін

@Kelvin - Насправді, methods.include?більш інформативний: $ irb irb(main):001:0> Fixnum.methods.include?(to_a) (irb):1: warning: default to_a 'буде застарілим=> false irb(main):002:0> Fixnum.instance_methods.include?(:to_a) => false
Річард Тернер

1
@RichardTurner Я припускаю, що ви використовуєте рубін 1.8. Боюся, ви нерозумієте, що викликає to_aпопередження у першій формі. Це тому , що ви дзвоните to_aна self- ви на самому ділі не перевірки , є чи to_aце метод Fixnum. Спробуйте зателефонувати to_aсамостійно, і ви побачите те саме попередження.
Келвін

@Kelvin - Да! Пенні падає. Дякую.
Річард Тернер

34

Здається, ви робите це:

0..10.to_a

Попередження є від Fixnum # to_a, а не з діапазону № до_а. Спробуйте це замість цього:

(0..10).to_a



4

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

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

Це через реалізацію діапазонів.
Тому мені довелося скористатися наступним варіантом:

(1..5).to_a.reverse

4
Сьогодні я виявив , 5.downto(1).to_aщо є ще одним способом вираження спадну діапазону stackoverflow.com/a/8927009/703903
odlp
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.