Créer un tableau de symboles

130

Existe-t-il un moyen plus propre de faire quelque chose comme ça?

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

J'aurais pensé %sque j'aurais fait ce que je voulais, mais ce n'est pas le cas. Il prend juste tout entre les crochets et en fait un grand symbole.

Juste un petit ennui.

A dessiné
la source
1
C'est assez standard. Y a-t-il quelque chose dans votre implémentation qui rend cette méthode indésirable?
dwhalen
5
Pas "vraiment" mais Rails a souvent du sucre syntaxique comme celui-ci qui me fait sentir tout chaud à l'intérieur en utilisant. :)
Match
depuis ruby ​​2, il y en a! voir stackoverflow.com/questions/8816877/…
m_x
1
Possible duplication de Y a
ymoreau

Réponses:

357

La réponse originale a été écrite en septembre 2011, mais à partir de Ruby 2.0 , il existe un moyen plus court de créer un tableau de symboles! Ce littéral:

%i[address city state postal country]

fera exactement ce que vous voulez.

Joost Baaij
la source
3
J'oublie toujours que cela signifie "intern" une alternative à "to_sym". Voir codecademy.com/forum_questions/512a675cf116c52d0d00674b
A5308Y
Notez l'emphase de ruby ​​2. Ceci n'est pas montré dans le livre Ruby Programming Language car cela ne couvre que jusqu'à 1.9.3.
Donato
Lors de l'utilisation de la syntaxe littérale% de ruby, je préfère utiliser deux caractères non alphanumériques à la place des crochets, c'est%i|a b c|
Epigene
6
Bien que cela fasse ce que vous voulez, quiconque voit cela dans votre base de code devra le rechercher sur Google pour comprendre la syntaxe bizarro que Ruby nous a lancée cette fois. Je recommande fortement d'éviter les fonctionnalités de langage obscures lorsqu'il existe des alternatives parfaitement lisibles, à savoir [: adresse,: ville,: état].
Alex
Merci, c'est vraiment utile.
sonnyhe2002
91

Avec un risque de devenir trop littéral, je pense que le moyen le plus propre de construire un tableau de symboles est d'utiliser un tableau de symboles.

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

Je ne peux penser à rien de plus concis que ça.

Joost Baaij
la source
11
Voulez-vous dire "trop ​​littéral"?
Andrew Grimm
J'aime toujours trouver et utiliser les moyens les plus puissants et les plus concis de faire les choses. Cette réponse est en fait moins de frappes que la mienne pour cette liste particulière, mais avec une liste d'environ 9 éléments ou plus, une alternative serait plus courte. Merci d'avoir répondu. :)
Tiré le
4
Je pense que la lisibilité l'emporte sur tout dans ce cas. Cette réponse est BEAUCOUP plus lisible (IMO) que l'alternative% w / to_sym. Ne faites pas en sorte que le prochain développeur qui reprenne vos affaires veuille vous frapper à la gorge.
Bruce Hubbard
3

%i[ ] Tableau non interpolé de symboles, séparés par des espaces (après Ruby 2.0)

%I[ ] Tableau interpolé de symboles, séparés par des espaces (après Ruby 2.0)

%i[address city state postal country]

la manière la plus propre de faire ceci est:

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

askrynnikov
la source