Bagaimana cara menginisialisasi array dalam satu langkah menggunakan Ruby?

105

Saya menginisialisasi array dengan cara ini:

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

Apakah mungkin melakukan itu dalam satu langkah? Jika ya, bagaimana caranya?

pengguna502052
sumber
20
+1 hanya untuk dorongan berulang baris tunggal baru. :)
Phrogz
1
@ Phrogz sedikit lebih pendek:; array = Array.new << 1 << 2 << 3 )
Alexander Suraphel
@AlexanderSuraphel Itu membuat sebuah array Fixnums, bukan sebuah array string.
Phrogz
1
@ Phrogz saya hanya ingin menyebutkan bahwa itu bahkan bisa lebih pendek. Anda hanya perlu pindah 1ke '1'.
Alexander Suraphel

Jawaban:

192

Anda dapat menggunakan literal array:

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

Anda juga dapat menggunakan rentang:

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

Untuk array string yang dipisahkan spasi, Anda dapat menggunakan sintaks Percent String :

array = %w[ 1 2 3 ]

Anda juga dapat memberikan satu blok ke Array.newuntuk menentukan berapa nilai untuk setiap entri:

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

Akhirnya, meskipun tidak menghasilkan larik tiga string yang sama seperti jawaban lain di atas, perhatikan juga bahwa Anda dapat menggunakan enumerator di Ruby 1.8.7+ untuk membuat larik; sebagai contoh:

array = 1.step(17,3).to_a
#=> [1, 4, 7, 10, 13, 16]
Phrogz
sumber
4
Ditambah satu untuk jawaban rinci, meskipun saya lebih suka gambar percikan to_a( [*'1'..'3']).
Michael Kohl
@MichaelKohl Saya setuju; Saya berada di bawah kesan (keliru) bahwa Anda tidak bisa memerciki kisaran di 1.8.6. Saya akan menambahkan itu, terima kasih! Perhatikan bahwa Anda tidak perlu memercik dalam literal larik (kecuali Anda mengomposisikan bersama dengan percikan).
Phrogz
Saya tahu, hanya saja saya kebanyakan menggunakan gambar percikan untuk tujuan itu (pengomposisian) dan saya juga suka itu menunjukkan hasil akhirnya.
Michael Kohl
2
Juga, metode kelas Array :: [] dapat digunakan: Array[ "1","2","3"] #=> ["1","2","3"](Saya tidak berpikir metode ini ada hubungannya dengan konstruktor literal array). Anda juga dapat menggunakan Kernel # Array tingkat atas (nama metode terlihat seperti nama kelas)Array(1..5) #=> [1,2,3,4,5]
b1_
apa yang * lakukan? dimana saya bisa menemukan dokumentasi untuk itu?
Arnold Roa
22

Oneliner:

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

atau

 a = %w| 1 2 3 4 5 |

atau

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

atau

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

atau

 a = Array[*'1'..'3']
pankajdoharey
sumber
8
Saya tidak menolaknya, tapi saya menebak karena ini memanggil tiga metode dan secara bertahap menumbuhkan array, sebagai lawan [1,2,3]yang melakukan inisialisasi tunggal. Juga, milikmu lebih banyak karakter. Juga, Anda telah membuat sebuah array Fixnums sedangkan OP menanyakan tentang sebuah array string.
Phrogz
8

Bersamaan dengan jawaban di atas, Anda juga bisa melakukan ini

    =>  [*'1'.."5"]   #remember *
    => ["1", "2", "3", "4", "5"]
RameshVel
sumber
1
Dalam 1,9 Anda juga dapat melakukannya dengan cara ini: >> [*?1..?5] #=> ["1", "2", "3", "4", "5"].
Michael Kohl
7

Untuk membuktikan Ada Lebih dari Satu Enam Cara Untuk Melakukannya:

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

Jika 1.method (: +) tidak memungkinkan, Anda juga bisa melakukannya

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

Tentu, ini berlebihan dalam skenario ini, tetapi jika plus_1ekspresi yang sangat panjang, Anda mungkin ingin meletakkannya di baris terpisah dari pembuatan array.

Andrew Grimm
sumber
3

Anda dapat melakukan

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

Seperti yang dicatat orang lain, Anda juga bisa menginisialisasi array dengan notasi% w seperti ini:

array = %w(1 2 3)

atau

array = %w[1 2 3]

Harap dicatat bahwa dalam kedua kasus, setiap elemen adalah string, bukan integer. Jadi, jika Anda menginginkan array yang elemennya bilangan bulat, Anda tidak boleh membungkus setiap elemen dengan apostrof:

array_of_integers = [1, 2, 3]

Selain itu, Anda tidak perlu meletakkan koma di antara elemen (yang diperlukan saat membuat array tanpa notasi% w ini). Jika Anda melakukan ini (yang sering saya lakukan karena kesalahan), seperti di:

wrong_array = %w(1, 2, 3)

elemennya akan menjadi tiga string ---- "1,", "2,", "3". Jadi jika Anda melakukannya:

puts wrong_array

outputnya adalah:

1,
2,
3
=>nil

yang bukan yang kita inginkan di sini.

Semoga ini bisa membantu memperjelas maksudnya!

Taiga
sumber
2

Untuk membuat array seperti itu, Anda dapat melakukan:

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

Jika Anda memiliki Array string, Anda juga dapat menginisialisasinya seperti ini:

array = %w{1 2 3}

pisahkan setiap elemen dengan spasi

John Douthat
sumber
1

Anda dapat menginisialisasi array dalam satu langkah dengan menulis elemen []seperti ini:

array = ['1', '2', '3']
sepp2k.dll
sumber
0

Anda cukup melakukan ini dengan %wnotasi dalam array ruby.

array = %w(1 2 3)

Ini akan menambahkan nilai array 1,2,3 ke array dan mencetak output sebagai ["1", "2", "3"]

Prabhakar Undurthi
sumber