Konversi string menjadi simbol dalam ruby

241

Simbol biasanya direpresentasikan seperti itu

:book_author_title

tetapi jika saya memiliki string:

"Book Author Title"

apakah ada cara dibangun di rel / ruby ​​untuk mengubahnya menjadi simbol di mana saya dapat menggunakan : notasi tanpa hanya melakukan penggantian string regex mentah?

Christopher
sumber
Daripada konversi, Anda mungkin tertarik pada akses acuh tak acuh - metode yang bekerja sama untuk parameter string dan simbol .
Boris Stitnicky

Jawaban:

361

Rails mendapat ActiveSupport::CoreExtensions::String::Inflectionsmodul yang menyediakan metode seperti itu. Semuanya layak untuk dilihat. Sebagai contoh Anda:

'Book Author Title'.parameterize.underscore.to_sym # :book_author_title
Priit
sumber
ini bekerja dengan sangat baik! Anda dapat memiliki kata cuaca atau tidak di mana huruf besar. parameterize akan mengatasinya.
TheLegend
apakah ada cara untuk membalikkan ini, tanpa menggunakan GSUB?
Zack
@Zack .to_sdan .humanizeharus melakukan pekerjaan kecuali Anda perlu mempertahankan kapitalisasi penuh.
Tyler Diaz
Cara yang baik untuk melakukan konversi sesuatu adalah dengan dapat melakukan dan membatalkan operasi. .to_sym dapat mengkonversi satu arah (dari string ke simbol), dan .to_s dapat mengkonversi (dari simbol ke string). dan jika Anda berurusan dengan sebuah array, pertimbangkan .map (&: to_sym) atau .map (& to_s) untuk mengonversi semua elemen.
jasonleonhard
2
parameterize ('_'). to_sym sedikit lebih pendek dari parameterize.underscore.to_sym.
IAmNaN
228

dari: http://ruby-doc.org/core/classes/String.html#M000809

str.intern => symbol
str.to_sym => symbol

Mengembalikan Simbol yang sesuai dengan str, menciptakan simbol jika sebelumnya tidak ada. Lihat Symbol#id2name.

"Koala".intern         #=> :Koala
s = 'cat'.to_sym       #=> :cat
s == :cat              #=> true
s = '@cat'.to_sym      #=> :@cat
s == :@cat             #=> true

Ini juga dapat digunakan untuk membuat simbol yang tidak dapat direpresentasikan menggunakan :xxxnotasi.

'cat and dog'.to_sym   #=> :"cat and dog"

Tapi untuk contoh Anda ...

"Book Author Title".gsub(/\s+/, "_").downcase.to_sym

harus pergi ;)

kebun binatang
sumber
1
Contoh brilian. Terima kasih.
Paul
8
Poster asli mungkin senang dengan jawaban Rails, tetapi posting ini menjawab pertanyaan aktual yang diajukan.
Russ Bateman
2
Tidak benar bahwa "[ to_sym] juga dapat digunakan untuk membuat simbol yang tidak dapat direpresentasikan menggunakan notasi: xxx". :'cat and dog'sama dengan 'cat and dog'.to_sym.
Michael Dorst
2
Seseorang bahkan dapat melakukan hal-hal aneh seperti itu :"cat and dog\n on a new line"tanpa perlu to_sym.
Michael Dorst
3
Pertanyaannya adalah tentang konversi di Ruby, bukan Rails. Ini jawaban yang benar.
Katarzyna
14

intern → symbol Mengembalikan simbol yang sesuai dengan str, membuat simbol jika sebelumnya tidak ada

"edition".intern # :edition

http://ruby-doc.org/core-2.1.0/String.html#method-i-intern

Julio Marins
sumber
Seperti ini sejak solusi string.to_sym saya beri saya peringatan keamanan :)
Denny Mueller
11

Di Rails Anda dapat melakukan ini menggunakan underscoremetode:

"Book Author Title".delete(' ').underscore.to_sym
=> :book_author_title

Kode yang lebih sederhana menggunakan regex (berfungsi dengan Ruby):

"Book Author Title".downcase.gsub(/\s+/, "_").to_sym
=> :book_author_title
Chandra Patni
sumber
3
ini hanya akan berfungsi jika semua kata diawali dengan huruf besar, jika "Anjing Gendut" saya akan kembali: myfat_dog.
TheLegend
9

Apakah ini yang Anda cari ?:

:"Book Author Title"

:)

Kai Stinchcombe
sumber
1

Ini bukan menjawab pertanyaan itu sendiri, tetapi saya menemukan pertanyaan ini mencari solusi untuk mengubah string menjadi simbol dan menggunakannya pada hash.

hsh = Hash.new
str_to_symbol = "Book Author Title".downcase.gsub(/\s+/, "_").to_sym
hsh[str_to_symbol] = 10
p hsh
# => {book_author_title: 10}

Semoga ini bisa membantu orang seperti saya!

Fábio Araújo
sumber