Я инициализирую массив таким образом:
array = Array.new
array << '1' << '2' << '3'
Возможно ли это сделать за один шаг? Если да, то как?
array = Array.new << 1 << 2 << 3
)
1
на '1'
.
Я инициализирую массив таким образом:
array = Array.new
array << '1' << '2' << '3'
Возможно ли это сделать за один шаг? Если да, то как?
array = Array.new << 1 << 2 << 3
)
1
на '1'
.
Ответы:
Вы можете использовать литерал массива:
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]
to_a
( [*'1'..'3']
).
Array[ "1","2","3"] #=> ["1","2","3"]
(я не думаю, что этот метод имеет какое-либо отношение к конструктору литерала массива). Вы также можете использовать массив # ядра верхнего уровня (имя метода действительно похоже на имя класса)Array(1..5) #=> [1,2,3,4,5]
Один лайнер:
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']
[1,2,3]
который выполняет единственную инициализацию. Также у вас больше персонажей. Кроме того, вы создали массив Fixnums, в то время как OP спрашивал о массиве строк.
Наряду с приведенными выше ответами вы тоже можете это сделать
=> [*'1'.."5"] #remember *
=> ["1", "2", "3", "4", "5"]
>> [*?1..?5] #=> ["1", "2", "3", "4", "5"]
.
Чтобы доказать, что существует более одного шести способов сделать это:
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
это действительно длинное выражение, вы можете поместить его в отдельную строку от создания массива.
Ты можешь сделать
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
чего мы здесь не хотим.
Надеюсь, это поможет прояснить суть дела!
Если у вас есть массив строк, вы также можете инициализировать его следующим образом:
array = %w{1 2 3}
просто разделите каждый элемент любым пробелом
Вы можете просто сделать это с помощью %w
обозначений в рубиновых массивах.
array = %w(1 2 3)
Он добавит в массив значения 1,2,3 и распечатает результат как ["1", "2", "3"]