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?


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

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 ;)


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



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

3
ini hanya akan berfungsi jika semua kata diawali dengan huruf besar, jika "Anjing Gendut" saya akan kembali: myfat_dog.
TheLegend


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!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.