Buat berbagai simbol

130

Apakah ada cara yang lebih bersih untuk melakukan hal seperti ini?

%w[address city state postal country].map(&:to_sym) 
#=> [:address, :city, :state, :postal, :country]

Saya akan mengira %sakan melakukan apa yang saya inginkan, tetapi ternyata tidak. Hanya mengambil segala sesuatu di antara kurung dan membuat satu simbol besar dari itu.

Hanya gangguan kecil.

Drew
sumber
1
Itu cukup standar. Adakah sesuatu tentang implementasi Anda yang membuat metode ini tidak diinginkan?
dwhalen
5
Bukan "benar-benar" tetapi Rails sering memiliki gula sintaksis seperti ini yang membuat saya merasa hangat di dalam dengan menggunakan. :)
Drew
sejak ruby ​​2, ada! lihat stackoverflow.com/questions/8816877/…
m_x
1
Kemungkinan rangkap dari Apakah ada notasi literal untuk berbagai simbol?
ymoreau

Jawaban:

357

Jawaban aslinya ditulis kembali pada bulan September '11, tetapi, mulai dari Ruby 2.0 , ada cara yang lebih pendek untuk membuat array simbol! Literal ini:

%i[address city state postal country]

akan melakukan apa yang Anda inginkan.

Joost Baaij
sumber
3
Saya selalu lupa bahwa itu singkatan dari "magang" alternatif untuk "to_sym". Lihat codecademy.com/forum_questions/512a675cf116c52d0d00674b
A5308Y
Perhatikan penekanan ruby ​​2. Ini tidak ditampilkan dalam buku Bahasa Pemrograman Ruby karena itu hanya mencakup hingga 1.9.3.
Donato
Saat menggunakan sintaks% literal ruby ​​saya lebih suka menggunakan dua karakter non-alfanumerik sebagai pengganti tanda kurung, yaitu%i|a b c|
Epigene
6
Sementara ini melakukan apa yang Anda inginkan, siapa pun yang melihat ini di basis kode Anda harus Google untuk mencari tahu apa sintaksis bizarro yang telah dilemparkan Ruby kepada kami saat ini. Saya sangat merekomendasikan menghindari fitur bahasa yang tidak jelas ketika ada alternatif yang dapat dibaca dengan sempurna, yaitu [: alamat,: kota,: negara].
Alex
Terima kasih ini sangat membantu.
sonnyhe2002
91

Dengan risiko menjadi terlalu literal, saya pikir cara paling bersih untuk membangun array simbol menggunakan array simbol.

fields = [:address, :city, :state, :postal, :country]

Tidak bisa memikirkan sesuatu yang lebih ringkas dari itu.

Joost Baaij
sumber
11
Apakah maksud Anda "terlalu harfiah"?
Andrew Grimm
Saya selalu suka menemukan dan menggunakan cara-cara paling kuat dan ringkas dalam melakukan sesuatu. Jawaban ini sebenarnya kurang penekanan tombol dari saya untuk daftar khusus ini tetapi dengan daftar ~ 9 atau lebih item, alternatif akan lebih pendek. Terima kasih atas jawabannya. :)
Drew
4
Saya pikir keterbacaan mengalahkan semua dalam hal ini. Jawaban ini jauh lebih mudah dibaca (IMO) daripada alternatif% w / to_sym. Jangan membuat pengembang berikutnya untuk mengambil alih barang-barang Anda yang ingin meninju Anda.
Bruce Hubbard
3

%i[ ] Array simbol yang tidak diinterpolasi, dipisahkan oleh spasi putih (setelah Ruby 2.0)

%I[ ] Array simbol yang diinterpolasi, dipisahkan oleh spasi putih (setelah Ruby 2.0)

%i[address city state postal country]

cara terbersih untuk melakukan ini adalah:

%w[address city state postal country].map(&:to_sym)

askrynnikov
sumber