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?


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

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


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



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

3
isso só funcionará se todas as palavras começarem com maiúsculas; se fosse "meu cão gordo", retornará: myfat_dog.
precisa


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!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.