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?


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

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


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



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

3
esto solo funcionará si todas las palabras comienzan con mayúscula, si fue "mi perro gordo" devolverá: myfat_dog.
TheLegend


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!

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.