Erstellen Sie eine Reihe von Symbolen

130

Gibt es eine sauberere Möglichkeit, so etwas zu tun?

%w[address city state postal country].map(&:to_sym) 
#=> [:address, :city, :state, :postal, :country]

Ich hätte gedacht, ich hätte %sgetan, was ich wollte, aber das tut es nicht. Es nimmt einfach alles zwischen die Klammern und macht ein großes Symbol daraus.

Nur ein kleiner Ärger.

Drew
quelle
1
Das ist ziemlich normal. Gibt es irgendetwas an Ihrer Implementierung, das diese Methode unerwünscht macht?
Dwhalen
5
Nicht "wirklich", aber Rails hat oft syntaktischen Zucker wie diesen, wodurch ich mich durch die Verwendung ganz warm und prickelnd fühle. :)
Drew
seit rubin 2 gibt es! siehe stackoverflow.com/questions/8816877/…
m_x

Antworten:

357

Die ursprüngliche Antwort wurde im September '11 geschrieben, aber ab Ruby 2.0 gibt es eine kürzere Möglichkeit, eine Reihe von Symbolen zu erstellen! Dieses Wort:

%i[address city state postal country]

wird genau das tun, was Sie wollen.

Joost Baaij
quelle
3
Ich vergesse immer, dass es für "intern" steht, eine Alternative zu "to_sym". Siehe codecademy.com/forum_questions/512a675cf116c52d0d00674b
A5308Y
Beachten Sie die Betonung von Ruby 2. Dies wird im Ruby Programming Language-Buch nicht gezeigt, da dies nur bis zu 1.9.3 abdeckt.
Donato
Wenn ich die% -Literal-Syntax von Ruby verwende, bevorzuge ich die Verwendung von zwei nicht alphanumerischen Zeichen anstelle von Klammern, dh%i|a b c|
Epigene
6
Während dies tut, was Sie wollen, muss jeder, der dies in Ihrer Codebasis sieht, es googeln, um herauszufinden, welche bizarre Syntax Ruby diesmal auf uns geworfen hat. Ich empfehle dringend, obskure Sprachfunktionen zu vermeiden, wenn perfekt lesbare Alternativen vorhanden sind, z. B. [: Adresse ,: Stadt ,: Bundesland].
Alex
Danke das ist wirklich hilfreich.
Sonnyhe2002
91

Ich denke, der sauberste Weg, ein Array von Symbolen zu konstruieren, besteht darin, ein Array von Symbolen zu verwenden.

fields = [:address, :city, :state, :postal, :country]

Ich kann mir nichts prägnanteres vorstellen.

Joost Baaij
quelle
11
Meinst du "zu wörtlich"?
Andrew Grimm
Ich mag es immer, die mächtigsten und prägnantesten Methoden zu finden und anzuwenden. Diese Antwort enthält weniger Tastenanschläge als meine für diese bestimmte Liste, aber mit einer Liste von ~ 9 oder mehr Elementen wäre eine Alternative kürzer. Danke für die Antwort. :)
Drew
4
Ich denke, Lesbarkeit übertrumpft in diesem Fall alle. Diese Antwort ist viel besser lesbar (IMO) als die Alternative% w / to_sym. Lassen Sie sich nicht vom nächsten Entwickler, der Ihre Sachen übernimmt, in die Kehle schlagen.
Bruce Hubbard
3

%i[ ] Nicht interpoliertes Array von Symbolen, durch Leerzeichen getrennt (nach Ruby 2.0)

%I[ ] Interpoliertes Array von Symbolen, getrennt durch Leerzeichen (nach Ruby 2.0)

%i[address city state postal country]

Der sauberste Weg, dies zu tun, ist:

%w[address city state postal country].map(&:to_sym)

askrynnikov
quelle