Converter string em símbolo capaz de ruby

241

Os símbolos são geralmente representados como tal

:book_author_title

mas se eu tiver uma string:

"Book Author Title"

existe uma maneira integrada no rails / ruby ​​para convertê-lo em um símbolo no qual eu possa usar a : notação sem fazer apenas uma substituição de regex de string bruta?

Christopher
fonte
Em vez de conversão, você pode estar interessado em acesso indiferente - métodos que funcionam igualmente para parâmetros de string e símbolo .
Boris Stitnicky

Respostas:

360

O Rails ActiveSupport::CoreExtensions::String::Inflectionspossui um módulo que fornece esses métodos. Todos eles valem a pena olhar. Para o seu exemplo:

'Book Author Title'.parameterize.underscore.to_sym # :book_author_title
Priit
fonte
isso funciona muito bem! você poderia ter quaisquer palavras meteorológicas ou não, onde estão capitalizadas. o parametrizar irá resolver isso.
TheLegend
existe alguma maneira de reverter isso, sem usar gsub?
Zack
@ Zack .to_se .humanizedeve fazer o trabalho, a menos que você precise preservar a capitalização total.
Tyler Diaz
Uma boa maneira de abordar a conversão de qualquer coisa é poder fazer e desfazer uma operação. .to_sym pode converter uma direção (de sequência em símbolo) e .to_s pode converter (de símbolo em sequência). e se você estiver lidando com uma matriz, considere .map (&: to_sym) ou .map (& to_s) para converter todos os elementos.
Jasonleonhard #
2
parameterize ('_'). to_sym é um pouco menor que parameterize.underscore.to_sym.
IAmNaN
228

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

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

Retorna o símbolo correspondente a str, criando o símbolo se ele não existia anteriormente. Veja Symbol#id2name.

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

Isso também pode ser usado para criar símbolos que não podem ser representados usando a :xxxnotação.

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

Mas para o seu exemplo ...

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

deve ir ;)

zzeroo
fonte
1
Exemplos brilhantes. Obrigado.
Paulo Paul
8
O pôster original pode ter ficado satisfeito com a resposta do Rails, mas este post responde à pergunta real.
Russ Bateman
2
Não é verdade que "[ to_sym] também pode ser usado para criar símbolos que não podem ser representados usando a notação: xxx". :'cat and dog'é o mesmo que 'cat and dog'.to_sym.
Michael Dorst
2
Pode-se até fazer coisas estranhas :"cat and dog\n on a new line"sem a necessidade to_sym.
Michael Dorst
3
A questão era sobre conversão no Ruby, não no Rails. Esta é uma resposta correta.
Katarzyna
14

intern → symbol Retorna o símbolo correspondente a str, criando o símbolo se ele não existia anteriormente

"edition".intern # :edition

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

Julio Marins
fonte
Como este desde a minha solução string.to_sym me dar um aviso de segurança :)
Denny Mueller
11

No Rails, você pode fazer isso usando o underscoremétodo:

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

O código mais simples está usando o regex (funciona com Ruby):

"Book Author Title".downcase.gsub(/\s+/, "_").to_sym
=> :book_author_title
Chandra Patni
fonte
3
isso só funcionará se todas as palavras começarem com maiúsculas; se fosse "meu cão gordo", retornará: myfat_dog.
precisa
9

É isso que você está procurando ?:

:"Book Author Title"

:)

Kai Stinchcombe
fonte
1

Isso não está respondendo à pergunta em si, mas eu a encontrei procurando a solução para converter uma string em símbolo e usá-la em um 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}

Espero que ajude alguém como eu!

Fábio Araújo
fonte