Dizeyi ruby ​​içinde sembolle dönüştürme


241

Semboller genellikle bu şekilde temsil edilir

:book_author_title

ama bir dize varsa:

"Book Author Title"

: sadece ham dize normal ifade yerine yapmadan gösterimi kullanabileceğiniz bir sembole dönüştürmek için raylar / yakut bir şekilde yerleşik bir yolu var mı?


Yanıtlar:


360

Rails ActiveSupport::CoreExtensions::String::Inflectionsbu yöntemleri sağlayan bir modül var . Hepsi bakmaya değer. Örneğiniz için:

'Book Author Title'.parameterize.underscore.to_sym # :book_author_title

bu gerçekten iyi çalışıyor! Büyük harflerle yazılan herhangi bir kelimeye hava durumu olabilir veya olmayabilir. Parametreleştirme bunu çözer.
TheLegend

gsub kullanmadan bunu tersine çevirmenin bir yolu var mı?
Zack

@Zack .to_sve .humanizetam büyük harfleri korumanız gerekmedikçe işi yapmalısınız.
Tyler Diaz

Bir şeyi dönüştürmeye yaklaşmanın iyi bir yolu, bir işlemi yapabilmek ve geri almaktır. .to_sym bir yönü (dizeden sembole) dönüştürebilir ve .to_s (simgeden dizeye) dönüşebilir. ve bir dizi ile uğraşıyorsanız, tüm öğeleri dönüştürmek için .map (&: to_sym) veya .map (& to_s) öğesini düşünün.
15:22

2
to_sym, parametresiz.underscore.to_sym'den biraz daha kısadır.
IAmNaN

228

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

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

strDaha önce mevcut değilse, sembolü oluşturarak karşılık gelen Sembolü döndürür . Bkz Symbol#id2name.

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

Bu, :xxxgösterimle temsil edilemeyen semboller oluşturmak için de kullanılabilir.

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

Ama örneğiniz için ...

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

gitmelisin ;)


1
Harika örnekler. Teşekkür ederim.
Paul

8
Orijinal poster Rails cevabından memnun olabilir, ancak bu yazı sorulan asıl soruyu cevaplar.
Russ Bateman

2
"[ to_sym] İfadesinin,: xxx notasyonu" ile temsil edilemeyen simgeler oluşturmak için de kullanılabileceği doğru değildir. :'cat and dog'ile aynıdır 'cat and dog'.to_sym.
Michael Dorst

2
Hatta :"cat and dog\n on a new line"ihtiyaç duyulmadan böyle tuhaf şeyler bile yapılabilir to_sym.
Michael Dorst

3
Soru Rails değil Ruby'deki dönüşümle ilgiliydi. Bu doğru bir cevap.
Katarzyna



11

Rails'te bunu underscoreyöntemi kullanarak yapabilirsiniz :

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

Daha basit kod regex kullanıyor (Ruby ile çalışıyor):

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

3
bu sadece tüm kelimeler büyük harfle başlıyorsa işe yarar, eğer benim "şişman köpeğim" ise geri döner: myfat_dog.
TheLegend


1

Bu sorunun kendisi cevap vermiyor, ancak bu soruyu bir dizeyi sembole dönüştürmek ve bir karma üzerinde kullanmak için çözüm ararken buldum.

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}

Umarım benim gibi birine yardımcı olur!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.