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.