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


105

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

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

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


20
+1 только за новое однострочное повторное нажатие. :)
Phrogz 05

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

@AlexanderSuraphel, который создает массив Fixnum вместо массива строк.
Phrogz 06

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

Для массивов строк, разделенных пробелами, вы можете использовать синтаксис Percent 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 to_a( [*'1'..'3']).
Майкл Коль

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

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

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

что делает *? где я могу найти для этого документацию?
Арнольд Роа

22

Один лайнер:

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 спрашивал о массиве строк.
Phrogz

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. метод (: +) невозможен, вы также можете сделать

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.