Konwertuj ciąg znaków na symboliczny w rubinie

241

Symbole są zwykle przedstawiane jako takie

:book_author_title

ale jeśli mam ciąg:

"Book Author Title"

czy istnieje wbudowany sposób w szyny / ruby, który przekształca go w symbol, w którym mogę używać : notacji bez konieczności zastępowania wyrażeń regularnych ciągiem regularnym?

Krzysztof
źródło

Odpowiedzi:

360

Railsy mają ActiveSupport::CoreExtensions::String::Inflectionsmoduł, który zapewnia takie metody. Wszystkie są warte obejrzenia. Na przykład:

'Book Author Title'.parameterize.underscore.to_sym # :book_author_title
Priit
źródło
to działa naprawdę dobrze! możesz mieć dowolne słowa o pogodzie lub nie, jeśli są one wielkie. sparametryzuje to.
TheLegend,
czy jest jakiś sposób, aby to odwrócić bez użycia gsub?
Zack
@Zack .to_si .humanizepowinien wykonać zadanie, chyba że musisz zachować pełną wielkość liter.
Tyler Diaz,
Dobrym sposobem na podejście do konwersji wszystkiego jest możliwość wykonania i cofnięcia operacji. .to_sym może konwertować jeden kierunek (z łańcucha na symbol), a .to_s może konwertować (z symbolu na łańcuch). a jeśli masz do czynienia z tablicą, rozważ .map (&: to_sym) lub .map (& to_s) do konwersji wszystkich elementów.
jasonleonhard
2
parametrize („_”). to_sym jest nieco krótszy niż parametrize.underscore.to_sym.
IAmNaN
228

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

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

Zwraca odpowiedni symbol str, tworząc symbol, jeśli wcześniej nie istniał. Zobaczyć Symbol#id2name.

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

Można to również wykorzystać do tworzenia symboli, których nie można przedstawić za pomocą :xxxnotacji.

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

Ale na przykład ...

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

powinien iść ;)

zzeroo
źródło
1
Genialne przykłady. Dziękuję Ci.
Paul
8
Oryginalny plakat mógł być zadowolony z odpowiedzi Railsów, ale ten post odpowiada na faktycznie zadane pytanie.
Russ Bateman
2
Nie jest prawdą, że „[ to_sym] można również wykorzystać do tworzenia symboli, których nie można przedstawić za pomocą notacji: xxx”. :'cat and dog'jest taki sam jak 'cat and dog'.to_sym.
Michael Dorst,
2
Można nawet robić takie dziwaczne rzeczy, jak :"cat and dog\n on a new line"bez potrzeby to_sym.
Michael Dorst,
3
Pytanie dotyczyło konwersji w Ruby, a nie w Railsach. To poprawna odpowiedź.
Katarzyna
14

intern → symbol Zwraca symbol odpowiadający str, tworząc symbol, jeśli wcześniej nie istniał

"edition".intern # :edition

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

Julio Marins
źródło
Tak jak ten, ponieważ moje rozwiązanie string.to_sym daje mi ostrzeżenie bezpieczeństwa :)
Denny Mueller
11

W Railsach możesz to zrobić za pomocą underscoremetody:

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

Prostszy kod używa wyrażenia regularnego (działa z Ruby):

"Book Author Title".downcase.gsub(/\s+/, "_").to_sym
=> :book_author_title
Chandra Patni
źródło
3
zadziała to tylko wtedy, gdy wszystkie słowa zaczną się od dużej litery, jeśli to będzie „mój gruby pies”, zwróci: myfat_dog.
TheLegend
9

Czy tego szukasz ?:

:"Book Author Title"

:)

Kai Stinchcombe
źródło
1

To nie odpowiada na samo pytanie, ale znalazłem to pytanie, szukając rozwiązania konwersji łańcucha na symbol i użycia go w haszowaniu.

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}

Mam nadzieję, że to pomaga komuś takiemu jak ja!

Fábio Araújo
źródło