Come inizializzare un array in un solo passaggio usando Ruby?


105

Inizializzo un array in questo modo:

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

È possibile farlo in un solo passaggio? Se é cosi, come?


20
+1 solo per la nuova spinta ripetuta su una riga :)
Phrogz

1
@Phrogz leggermente più corto:; array = Array.new << 1 << 2 << 3 )
Alexander Suraphel

@AlexanderSuraphel che crea un array di Fixnum invece di un array di stringhe.
Phrogz

1
@Phrogz volevo solo dire che può anche essere più breve. Devi solo cambiare 1in '1'.
Alexander Suraphel

Risposte:


192

Puoi usare un array letterale:

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

Puoi anche utilizzare un intervallo:

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

Per le matrici di stringhe delimitate da spazi, puoi usare la sintassi della stringa percentuale :

array = %w[ 1 2 3 ]

Puoi anche passare un blocco a Array.newper determinare quale sarà il valore di ciascuna voce:

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

Infine, sebbene non produca lo stesso array di tre stringhe delle altre risposte precedenti, nota anche che puoi usare gli enumeratori in Ruby 1.8.7+ per creare array; per esempio:

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

4
Più uno per la risposta dettagliata, anche se preferisco splat su to_a( [*'1'..'3']).
Michael Kohl

@MichaelKohl sono d'accordo; Avevo l'impressione (sbagliata) che non potessi splatare gli intervalli in 1.8.6. Lo aggiungo, grazie! Nota che non è necessario splat all'interno di un array letterale (a meno che tu non stia componendo insieme allo splat).
Phrogz

Lo so, è solo che uso principalmente splat per quello scopo (compositing che è) e mi piace anche che mostri ciò con cui finisci.
Michael Kohl

2
Inoltre, il metodo di classe Array :: [] può essere utilizzato: Array[ "1","2","3"] #=> ["1","2","3"](non credo che questo metodo abbia nulla a che fare con il costruttore letterale dell'array). Puoi anche usare il Kernel # Array di primo livello (il nome del metodo sembra un nome di classe)Array(1..5) #=> [1,2,3,4,5]
b1_

cosa * fa? dove posso trovare la documentazione per questo?
Arnold Roa

22

Oneliner:

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

o

 a = %w| 1 2 3 4 5 |

o

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

o

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

o

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

8
Non l'ho votato, ma immagino perché questo ha invocato tre metodi e aumenta in modo incrementale l'array, al contrario di quello [1,2,3]che fa una singola inizializzazione. Inoltre, il tuo è più personaggi. Inoltre, hai creato un array di Fixnum mentre l'OP chiedeva informazioni su un array di stringhe.
Phrogz

8

Insieme alle risposte di cui sopra, puoi farlo anche tu

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

1
In 1.9 è anche possibile fare in questo modo: >> [*?1..?5] #=> ["1", "2", "3", "4", "5"].
Michael Kohl

7

Per dimostrare C'è più di un sei modi per farlo:

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

Se il 1.metodo (: +) non fosse possibile, potresti anche farlo

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

Certo, è eccessivo in questo scenario, ma se plus_1fosse un'espressione molto lunga, potresti metterla su una riga separata dalla creazione dell'array.


3

Tu puoi fare

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

Come altri hanno notato, puoi anche inizializzare un array con la notazione% w in questo modo:

array = %w(1 2 3)

o

array = %w[1 2 3]

Si noti che in entrambi i casi ogni elemento è una stringa, anziché un numero intero. Quindi, se vuoi un array i cui elementi sono numeri interi, non dovresti racchiudere ogni elemento con apostrofi:

array_of_integers = [1, 2, 3]

Inoltre, non è necessario inserire una virgola tra gli elementi (che è necessario quando si crea un array senza questa notazione% w). Se lo fai (cosa che ho fatto spesso per errore), come in:

wrong_array = %w(1, 2, 3)

i suoi elementi saranno tre stringhe ---- "1,", "2", "3". Quindi se lo fai:

puts wrong_array

l'output sarà:

1,
2,
3
=>nil

che non è quello che vogliamo qui.

Spero che questo aiuti a chiarire il punto!



2

Se hai un array di stringhe, puoi anche inizializzarlo in questo modo:

array = %w{1 2 3}

separa semplicemente ogni elemento con uno spazio vuoto


1

Puoi inizializzare un array in un unico passaggio scrivendo gli elementi in []questo modo:

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

0

Puoi farlo semplicemente con la %wnotazione negli array di rubini.

array = %w(1 2 3)

Aggiungerà i valori dell'array 1,2,3 all'array e stamperà l'output come ["1", "2", "3"]

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.