2010-01-05 12 views
198

Symbole werden in der Regel als solcheConvert String Symbol-able in Ruby

:book_author_title 

vertreten, aber wenn ich einen String haben:

"Book Author Title" 

gibt es eine in Schienen in Art und Weise gebaut/ruby ​​umwandeln es in ein Symbol, wo ich die : Schreibweise verwenden kann, ohne nur eine rohe Zeichenfolge regex ersetzen?

+0

Statt Umwandlung, yo Interessieren Sie sich für [indifferent access - Methoden, die für String- und Symbolparameter gleichermaßen funktionieren] (http://stackoverflow.com/questions/10780817). –

Antwort

302

Rails bekam ActiveSupport::CoreExtensions::String::Inflections Modul, das solche Verfahren zur Verfügung stellt. Sie sind alle sehenswert. Für Ihr Beispiel:

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

das funktioniert wirklich gut! Sie könnten irgendwelche Wörter Wetter haben oder nicht, wo sie groß geschrieben wurden. Die Parametrisierung wird es aussortieren. – TheLegend

+0

Gibt es eine Möglichkeit, dies umzukehren, ohne gsub zu verwenden? – Zack

+0

@Zack '.to_s' und' .humanize' sollten den Job erledigen, es sei denn, Sie müssen die volle Großschreibung beibehalten. –

10

In Rails können Sie diese mit underscore Methode tun:

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

Je einfacher Code regex verwendet (funktioniert mit Rubin):

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

dies funktioniert nur, wenn alle Wörter mit einem Großbuchstaben beginnen, wenn es "mein dicker Hund" ist, wird es zurückgeben: myfat_dog. – TheLegend

199

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

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

Gibt das Symbol zurück, das str entspricht, und erzeugt das Symbol, wenn es nicht pr früher existieren. Siehe Symbol#id2name.

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

Dies kann auch Symbole verwendet werden, zu erstellen, die nicht die :xxx Notation dargestellt werden können.

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

Aber für Ihr Beispiel ...

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

sollte gehen;)

+1

Brillante Beispiele. Vielen Dank. – Paul

+7

Das Originalplakat mag mit der Antwort von Rails zufrieden gewesen sein, aber dieser Post beantwortet die eigentliche Frage. –

+2

Es ist nicht wahr, dass "[' to_sym'] auch verwendet werden kann, um Symbole zu erzeugen, die nicht mit der: xxx-Notation dargestellt werden können ". ': 'cat and dog' ist dasselbe wie'' cat and dog'.to_sym'. – anthropomorphic

9

Ist das, was Sie für ?:

:"Book Author Title" 

:)

11

intern → Symbol suchen das Symbol Kosten entspricht das Symbol auf str und schafft, wenn es vorher nicht existieren

"edition".intern # :edition 

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

+0

wie dieser seit meiner string.to_sym lösung gib mir eine sicherheitswarnung :) –