Convertir une chaîne en symboles en rubis


241

Les symboles sont généralement représentés comme tels

:book_author_title

mais si j'ai une chaîne:

"Book Author Title"

y a-t-il un chemin intégré dans rails / ruby ​​pour le convertir en un symbole où je peux utiliser la : notation sans simplement faire un regex de chaîne brut?


Réponses:


361

Rails a un ActiveSupport::CoreExtensions::String::Inflectionsmodule qui fournit de telles méthodes. Ils valent tous la peine d'être examinés. Pour votre exemple:

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

ça marche vraiment bien! vous pourriez avoir des mots météo ou non où ils étaient capitalisés. le paramétrage le triera.
TheLegend

existe-t-il un moyen d'inverser cela, sans utiliser gsub?
Zack

@Zack .to_set .humanizedevrait faire le travail à moins que vous ne deviez conserver une capitalisation complète.
Tyler Diaz du

Une bonne façon d'aborder la conversion de n'importe quoi est de pouvoir faire et annuler une opération. .to_sym peut convertir une direction (de chaîne en symbole) et .to_s peut convertir (de symbole en chaîne). et si vous avez affaire à un tableau, envisagez .map (&: to_sym) ou .map (& to_s) pour convertir tous les éléments.
jasonleonhard

2
parameterize ('_'). to_sym est un peu plus court que parameterize.underscore.to_sym.
IAmNaN

228

à partir de: http://ruby-doc.org/core/classes/String.html#M000809

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

Renvoie le symbole correspondant à str, créant le symbole s'il n'existait pas auparavant. Tu vois Symbol#id2name.

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

Cela peut également être utilisé pour créer des symboles qui ne peuvent pas être représentés à l'aide de la :xxxnotation.

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

Mais pour votre exemple ...

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

devrait aller ;)


1
Des exemples brillants. Je vous remercie.
Paul

8
L'affiche originale était peut-être satisfaite de la réponse de Rails, mais ce message répond à la question posée.
Russ Bateman

2
Il n'est pas vrai que "[ to_sym] peut également être utilisé pour créer des symboles qui ne peuvent pas être représentés à l'aide de la notation: xxx". :'cat and dog'est le même que 'cat and dog'.to_sym.
Michael Dorst

2
On peut même faire des choses bizarres :"cat and dog\n on a new line"sans avoir besoin de to_sym.
Michael Dorst

3
La question concernait la conversion en Ruby, pas Rails. Ceci est une bonne réponse.
Katarzyna



11

Dans Rails, vous pouvez le faire en utilisant la underscoreméthode:

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

Le code plus simple utilise regex (fonctionne avec Ruby):

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

3
cela ne fonctionnera que si tous les mots commencent par un majuscule, si c'était "mon gros chien" il retournera: myfat_dog.
TheLegend


1

Cela ne répond pas à la question elle-même, mais j'ai trouvé cette question en recherchant la solution pour convertir une chaîne en symbole et l'utiliser sur un hachage.

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}

J'espère que cela aide quelqu'un comme moi!

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.