Як ініціалізувати масив за один крок за допомогою Ruby?


105

Я ініціалізую масив таким чином:

array = Array.new
array << '1' << '2' << '3'

Чи можливо це зробити за один крок? Якщо так, то як?


20
+1 лише для одноразового повторного натискання. :)
Фрогз

1
@Phrogz трохи коротше:; array = Array.new << 1 << 2 << 3 )
Олександр Сурафель

@AlexanderSuraphel Це створює масив Fixnums замість масиву рядків.
Фрогз

1
@Phrogz я просто хотів зазначити, що він може бути навіть коротшим. Ви просто повинні змінити 1до '1'.
Олександр Сурафель

Відповіді:


192

Ви можете використовувати літерал масиву:

array = [ '1', '2', '3' ]

Ви також можете використовувати ряд:

array = ('1'..'3').to_a  # parentheses are required
# or
array = *('1'..'3')      # parentheses not required, but included for clarity

Для масивів рядків, обмежених пробілом, ви можете використовувати синтаксис Stcent String :

array = %w[ 1 2 3 ]

Ви також можете передати блок, щоб Array.newвизначити, яким буде значення для кожного запису:

array = Array.new(3) { |i| (i+1).to_s }

Нарешті, хоча він не створює такий самий масив з трьох рядків, як інші відповіді вище, зауважте також, що ви можете використовувати перелічувачі в Ruby 1.8.7+ для створення масивів; наприклад:

array = 1.step(17,3).to_a
#=> [1, 4, 7, 10, 13, 16]

4
Плюс один для детальної відповіді, навіть якщо я віддаю перевагу splat over to_a( [*'1'..'3']).
Майкл Коль

@MichaelKohl Я згоден; У мене склалося (помилкове) враження, що ви не можете спланувати діапазони в 1.8.6. Додам, дякую! Зауважте, що вам не потрібно плескати в літералі масиву (якщо тільки ви не створюєте композицію разом із значком).
Фрогз

Я знаю, що я здебільшого використовую для цієї мети splat (композицію, що є), і мені також подобається, що він показує, з чим ти закінчишся.
Майкл Коль

2
Також може бути використаний метод класу Array :: []: Array[ "1","2","3"] #=> ["1","2","3"](Я не думаю, що цей метод не має нічого спільного з конструктором прямої масиву). Ви також можете використовувати ядро ​​вищого рівня # Array (назва методу схожа на назву класу)Array(1..5) #=> [1,2,3,4,5]
b1_

що * робить? де я можу знайти на це документацію?
Арнольд Роа

22

Oneliner:

array = [] << 1 << 2 << 3   #this is for fixnums.

або

 a = %w| 1 2 3 4 5 |

або

 a = [*'1'..'3']

або

 a = Array.new(3, '1')

або

 a = Array[*'1'..'3']

8
Я не відмовився голосувати за це, але я здогадуюсь, тому що це викликало три методи і поступово збільшує масив, на відміну від [1,2,3]одного робить ініціалізацію. Також у вас більше символів. Крім того, ви створили масив Fixnums, тоді як OP запитував про масив рядків.
Фрогз

8

Поряд з вищезазначеними відповідями, ви можете це зробити і ви

    =>  [*'1'.."5"]   #remember *
    => ["1", "2", "3", "4", "5"]

1
В 1.9 ви також можете зробити це в такий спосіб: >> [*?1..?5] #=> ["1", "2", "3", "4", "5"].
Майкл Коль

7

Для того, щоб довести Там більше , ніж один Шість способів зробити це:

plus_1 = 1.method(:+)
Array.new(3, &plus_1) # => [1, 2, 3]

Якщо 1.method (: +) був неможливий, ви також можете це зробити

plus_1 = Proc.new {|n| n + 1}
Array.new(3, &plus_1) # => [1, 2, 3]

Звичайно, це надмірно в цьому сценарії, але якщо це plus_1був дійсно довгий вираз, ви, можливо, захочете поставити його окремим рядком від створення масиву.


3

Ви можете зробити

array = ['1', '2', '3']

Як зазначали інші, ви також можете ініціалізувати масив із позначенням% w таким чином:

array = %w(1 2 3)

або

array = %w[1 2 3]

Зверніть увагу, що в обох випадках кожен елемент є рядком, а не цілим числом. Отже, якщо ви хочете масив, елементи якого є цілими числами, не слід обертати кожен елемент апострофами:

array_of_integers = [1, 2, 3]

Крім того, вам не потрібно ставити кому між елементами (що необхідно при створенні масиву без цього позначення% w). Якщо ви робите це (що я часто робив помилково), як у:

wrong_array = %w(1, 2, 3)

її елементами будуть три рядки ---- "1", "2", "3". Отже, якщо ви робите:

puts wrong_array

вихід буде:

1,
2,
3
=>nil

чого ми не хочемо тут.

Сподіваюсь, це допоможе з’ясувати точку!



2

Якщо у вас є масив рядків, ви також можете ініціалізувати його так:

array = %w{1 2 3}

просто розділіть кожен елемент будь-яким пробілом


1

Ви можете ініціалізувати масив за один крок, записавши елементи []так:

array = ['1', '2', '3']

0

Ви можете просто зробити це з %wпозначеннями в рубінових масивах.

array = %w(1 2 3)

Це додасть значення масиву 1,2,3 до масиву та виведе вивід у вигляді ["1", "2", "3"]

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.