Konvertieren Sie eine Zeichenfolge in eine symbolfähige Zeichenfolge in Ruby


241

Symbole werden normalerweise als solche dargestellt

:book_author_title

aber wenn ich eine Zeichenfolge habe:

"Book Author Title"

Gibt es eine eingebaute Methode in Rails / Ruby, um sie in ein Symbol umzuwandeln, in dem ich die : Notation verwenden kann, ohne nur einen regulären String-Regex zu ersetzen?


Anstelle einer Konvertierung könnten Sie an gleichgültigen Zugriffsmethoden interessiert sein, die sowohl für Zeichenfolgen- als auch für Symbolparameter gleichermaßen funktionieren .
Boris Stitnicky

Antworten:


360

Rails hat ein ActiveSupport::CoreExtensions::String::InflectionsModul, das solche Methoden bereitstellt. Sie sind alle einen Blick wert. Für Ihr Beispiel:

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

das funktioniert wirklich gut! Sie könnten jedes Wort Wetter haben oder nicht, wo sie groß geschrieben wurden. Die Parametrierung wird es aussortieren.
TheLegend

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

@Zack .to_sund .humanizesollte den Job machen, es sei denn, Sie müssen die volle Kapitalisierung beibehalten.
Tyler Diaz

Ein guter Weg, um etwas zu konvertieren, besteht darin, einen Vorgang ausführen und rückgängig machen zu können. .to_sym kann eine Richtung konvertieren (von Zeichenfolge zu Symbol) und .to_s kann konvertieren (von Symbol zu Zeichenfolge). und wenn Sie es mit einem Array zu tun haben, ziehen Sie .map (&: to_sym) oder .map (& to_s) in Betracht, um alle Elemente zu konvertieren.
Jasonleonhard

2
parameterize ('_'). to_sym ist etwas kürzer als parameterize.underscore.to_sym.
IAmNaN

228

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

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

Gibt das entsprechende Symbol zurück strund erstellt das Symbol, falls es zuvor nicht vorhanden war. 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 verwendet werden, um Symbole zu erstellen, die mit der :xxxNotation nicht dargestellt werden können .

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

Aber für dein Beispiel ...

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

sollte gehen ;)


1
Geniale Beispiele. Danke dir.
Paul

8
Das Originalposter war möglicherweise mit der Antwort von Rails zufrieden, aber dieser Beitrag beantwortet die tatsächlich gestellte Frage.
Russ Bateman

2
Es ist nicht wahr, dass "[ to_sym] auch verwendet werden kann, um Symbole zu erstellen, die nicht mit der: xxx-Notation dargestellt werden können". :'cat and dog'ist das gleiche wie 'cat and dog'.to_sym.
Michael Dorst

2
Man kann sogar so ausgefallene Dinge tun, wie es nicht :"cat and dog\n on a new line"nötig ist to_sym.
Michael Dorst

3
Die Frage betraf die Konvertierung in Ruby, nicht Rails. Dies ist eine richtige Antwort.
Katarzyna



11

In Rails können Sie dies mit folgender underscoreMethode tun :

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

Der einfachere Code verwendet Regex (funktioniert mit Ruby):

"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 fetter Hund" war, wird es zurückgegeben: myfat_dog.
TheLegend


1

Dies beantwortet nicht die Frage selbst, aber ich fand diese Frage auf der Suche nach der Lösung, um eine Zeichenfolge in ein Symbol zu konvertieren und sie für einen Hash zu verwenden.

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}

Hoffe es hilft jemandem wie mir!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.