Como inicializar um array em uma etapa usando Ruby?

105

Eu inicializo um array desta maneira:

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

É possível fazer isso em uma etapa? Se sim, como?

user502052
fonte
20
+1 apenas para novos empurrões repetidos de linha única. :)
Phrogz
1
@Phrogz ligeiramente mais curto:; array = Array.new << 1 << 2 << 3 )
Alexander Suraphel
@AlexanderSuraphel Isso cria um array de Fixnums em vez de um array de strings.
Phrogz
1
@Phrogz, eu só queria dizer que pode ser ainda mais curto. Você apenas tem que mudar 1para '1'.
Alexander Suraphel

Respostas:

192

Você pode usar um literal de matriz:

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

Você também pode usar um intervalo:

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

Para matrizes de strings delimitadas por espaços em branco, você pode usar a sintaxe de string de porcentagem :

array = %w[ 1 2 3 ]

Você também pode passar um bloco para Array.newdeterminar qual será o valor de cada entrada:

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

Finalmente, embora não produza o mesmo array de três strings que as outras respostas acima, observe também que você pode usar enumeradores em Ruby 1.8.7+ para criar arrays; por exemplo:

array = 1.step(17,3).to_a
#=> [1, 4, 7, 10, 13, 16]
Phrogz
fonte
4
Mais um para a resposta detalhada, embora eu prefira splat a to_a( [*'1'..'3']).
Michael Kohl
@MichaelKohl eu concordo; Eu estava com a impressão (equivocada) de que você não poderia splat intervalos em 1.8.6. Vou adicionar isso, obrigado! Observe que você não precisa splat dentro de um literal de array (a menos que esteja compondo junto com o splat).
Phrogz
Eu sei, é que uso principalmente o splat para esse propósito (composição) e também gosto que ele mostre o que você acaba fazendo.
Michael Kohl
2
Além disso, o método de classe Array :: [] pode ser usado: Array[ "1","2","3"] #=> ["1","2","3"](não acho que esse método tenha algo a ver com o construtor literal de array). Você também pode usar o Kernel # Array de nível superior (o nome do método se parece com um nome de classe)Array(1..5) #=> [1,2,3,4,5]
b1_
o que * faz? onde posso encontrar documentação para isso?
Arnold Roa
22

Oneliner:

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

ou

 a = %w| 1 2 3 4 5 |

ou

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

ou

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

ou

 a = Array[*'1'..'3']
Pankajdoharey
fonte
8
Eu não votei contra isso, mas estou supondo porque isso invocou três métodos e aumenta o array de forma incremental, em vez de [1,2,3]fazer uma única inicialização. Além disso, o seu é mais personagens. Além disso, você criou um array de Fixnums enquanto o OP estava perguntando sobre um array de strings.
Phrogz
8

Junto com as respostas acima, você também pode fazer isso

    =>  [*'1'.."5"]   #remember *
    => ["1", "2", "3", "4", "5"]
RameshVel
fonte
1
Em 1,9 você também pode fazê-lo desta forma: >> [*?1..?5] #=> ["1", "2", "3", "4", "5"].
Michael Kohl
7

Para provar que há mais de um seis maneiras de fazer isso:

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

Se 1. método (: +) não fosse possível, você também poderia fazer

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

Claro, é um exagero neste cenário, mas se plus_1for uma expressão muito longa, você pode querer colocá-la em uma linha separada da criação do array.

Andrew Grimm
fonte
3

Você pode fazer

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

Como outros notaram, você também pode inicializar uma matriz com a notação% w assim:

array = %w(1 2 3)

ou

array = %w[1 2 3]

Observe que em ambos os casos cada elemento é uma string, em vez de um número inteiro. Portanto, se você deseja uma matriz cujos elementos são inteiros, não deve envolver cada elemento com apóstrofos:

array_of_integers = [1, 2, 3]

Além disso, você não precisa colocar vírgulas entre os elementos (o que é necessário ao criar um array sem esta notação% w). Se você fizer isso (o que eu costumava fazer por engano), como em:

wrong_array = %w(1, 2, 3)

seus elementos serão três strings ---- "1,", "2,", "3". Então, se você:

puts wrong_array

a saída será:

1,
2,
3
=>nil

que não é o que queremos aqui.

Espero que isso ajude a esclarecer o ponto!

Taiga
fonte
2

Para criar tal array, você pode fazer:

array = ['1', '2', '3']
Reese Moore
fonte
2

Se você tem uma matriz de strings, também pode inicializá-la assim:

array = %w{1 2 3}

apenas separe cada elemento com qualquer espaço em branco

John Douthat
fonte
1

Você pode inicializar uma matriz em uma etapa escrevendo os elementos []assim:

array = ['1', '2', '3']
sepp2k
fonte
0

Você pode simplesmente fazer isso com %wnotação em matrizes de rubi.

array = %w(1 2 3)

Ele adicionará os valores da matriz 1,2,3 à matriz e imprimirá a saída como ["1", "2", "3"]

Prabhakar Undurthi
fonte