2011-02-05 2 views
80

Я инициализировать массив таким образом:Как инициализировать массив за один шаг с помощью Ruby?

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

Можно ли сделать это за один шаг? Если да, то как?

+15

+1 только для новый однострочный повторный толкание. :) – Phrogz

+1

@Phrogz немного короче: 'array = Array.new << 1 << 2 << 3';) –

+0

@AlexanderSuraphel Создает массив Fixnums вместо массива строк. – Phrogz

ответ

156

Как уже отмечалось, вы можете использовать массив литерал:

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

Вы можете также, для примера, использовать диапазон:

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

Для массивов из многих строк с разделителями, простыми в этом отношении являются:

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 над 'to_a' (' [* '1' .. '3'] '). –

+0

@MichaelKohl Согласен; Я был под (ошибочным) впечатлением, что вы не могли спланировать диапазоны в 1.8.6. Я добавлю это, спасибо! Обратите внимание, что вам не нужно выделять внутри литерала массива (если вы не компонуете вместе с символом splat). – Phrogz

+0

Я знаю, это просто, что я в основном использую splat для этой цели (композиция, которая есть), и мне также нравится, что она показывает, в чем вы заканчиваете. –

2

Для создания такого массива вы могли бы сделать:

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

Вы можете инициализировать массив в одном шаге от записи элементов в [] так:

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

Если у вас есть массив строк, вы также можете инициализировать его следующим образом:

array = %w{1 2 3}

просто отделить каждый элемент с любой пробельных

8

Наряду с указанными выше ответами, вы можете сделать это слишком

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

В 1.9 вы также можете сделать это следующим образом: '>> [*? 1 ..? 5] # => [" 1 "," 2 "," 3 "," 4 "," 5 "]'. –

11

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'] 
+2

Зачем кому-то голосовать? – pankajdoharey

+8

Я не голосовал, но я предполагаю, потому что это вызвало три метода и постепенно увеличивало массив, в отличие от '[1,2,3]', который выполняет одиночную инициализацию. Кроме того, у вас больше персонажей. Кроме того, вы создали массив Fixnums, тогда как OP задавал вопрос о массиве строк. – Phrogz

7

Чтобы доказать Там больше, чем Один Шесть способов сделать это:

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

Если 1.Метод (+) не было возможно, вы могли бы также сделать

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

Конечно, это перебор в этом случае, но если plus_1 был действительно долго выражение, вы можете поставить его на отдельной линии от создание массива.

0

Вы можете просто сделать это с помощью нотации %w в рубиновых массивах.

array = %w(1 2 3) 

Это добавит массив значений 1,2,3 к arrayand распечатке на выходе как ["1", "2", "3"]

2

Вы можете сделать

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

Как уже отмечалось, вы можете также инициализировать массив с обозначениями% вес следующим образом:

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 

, который не то, что мы хотим здесь.

Надеюсь, что это поможет уточнить суть!

Смежные вопросы