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?


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

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


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



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

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


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!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.