Convierte una cadena a Symbol-able en ruby

241

Los símbolos generalmente se representan como tales

:book_author_title

pero si tengo una cadena:

"Book Author Title"

¿hay una forma integrada en rails / ruby ​​para convertirlo en un símbolo donde pueda usar la : notación sin solo hacer un reemplazo de expresión regular de cadena sin procesar?

Christopher
fuente
En lugar de la conversión, es posible que le interese el acceso indiferente, métodos que funcionan por igual para los parámetros de cadena y de símbolo .
Boris Stitnicky

Respuestas:

360

Rails tiene un ActiveSupport::CoreExtensions::String::Inflectionsmódulo que proporciona dichos métodos. Vale la pena mirarlos todos. Por su ejemplo:

'Book Author Title'.parameterize.underscore.to_sym # :book_author_title
Priit
fuente
esto funciona muy bien! podría tener alguna palabra del tiempo o no en mayúscula. el parametrizar lo resolverá.
TheLegend
¿Hay alguna manera de revertir esto, sin usar gsub?
Zack
@Zack .to_sy .humanizedebería hacer el trabajo a menos que necesite preservar la capitalización completa.
Tyler Diaz
Una buena manera de abordar la conversión de cualquier cosa es poder hacer y deshacer una operación. .to_sym puede convertir una dirección (de cadena a símbolo), y .to_s puede convertir (de símbolo a cadena). y si se trata de una matriz, considere .map (&: to_sym) o .map (& to_s) para convertir todos los elementos.
jasonleonhard
2
parametrize ('_'). to_sym es un poco más corto que parameterize.underscore.to_sym.
IAmNaN
228

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

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

Devuelve el símbolo correspondiente a str, creando el símbolo si no existía anteriormente. Ver Symbol#id2name.

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

Esto también se puede usar para crear símbolos que no se pueden representar usando la :xxxnotación.

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

Pero por tu ejemplo ...

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

debería ir ;)

zzeroo
fuente
1
Brillantes ejemplos. Gracias.
Paul
8
El póster original puede haber estado contento con la respuesta de Rails, pero esta publicación responde a la pregunta real.
Russ Bateman
2
No es cierto que "[ to_sym] también se pueda usar para crear símbolos que no se puedan representar con la notación: xxx". :'cat and dog'es el mismo que 'cat and dog'.to_sym.
Michael Dorst
2
Incluso se pueden hacer cosas extravagantes :"cat and dog\n on a new line"sin la necesidad de hacerlo to_sym.
Michael Dorst
3
La pregunta era sobre la conversión en Ruby, no en Rails. Esta es una respuesta correcta.
Katarzyna
14

interno → símbolo Devuelve el símbolo correspondiente a str, creando el símbolo si no existía anteriormente

"edition".intern # :edition

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

Julio Marins
fuente
Como este desde mi solución string.to_sym, dame una advertencia de seguridad :)
Denny Mueller
11

En Rails puedes hacer esto usando el underscoremétodo:

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

El código más simple usa regex (funciona con Ruby):

"Book Author Title".downcase.gsub(/\s+/, "_").to_sym
=> :book_author_title
Chandra Patni
fuente
3
esto solo funcionará si todas las palabras comienzan con mayúscula, si fue "mi perro gordo" devolverá: myfat_dog.
TheLegend
9

¿Es esto lo que estás buscando ?:

:"Book Author Title"

:)

Kai Stinchcombe
fuente
1

Esto no responde a la pregunta en sí, pero encontré esta pregunta buscando la solución para convertir una cadena en símbolo y usarla en un 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 ayude a alguien como yo!

Fábio Araújo
fuente