Que signifie% w (tableau)?

837

Je regarde la documentation de FileUtils.

Je suis confus par la ligne suivante:

FileUtils.cp %w(cgi.rb complex.rb date.rb), '/usr/lib/ruby/1.6'

Qu'est-ce que cela %wsignifie? Pouvez-vous m'indiquer la documentation?

Dane O'Connor
la source

Réponses:

1246

%w(foo bar)est un raccourci pour ["foo", "bar"]. Ce qui signifie que c'est une notation pour écrire un tableau de chaînes séparées par des espaces au lieu de virgules et sans guillemets autour d'eux. Vous pouvez trouver une liste de façons d'écrire des littéraux dans la référence rapide de zenspider .

sepp2k
la source
199
De plus, la parenthèse peut être presque n'importe quel autre caractère tel que les crochets% w [...], les accolades frisées% w {...} ou même quelque chose comme des points d'exclamation% w! ...!. Tous ces éléments ont le même comportement (renvoyer un tableau).
ryanb
143
Le moyen le plus simple de se souvenir mnémoniquement de ce que cela signifie est «tableau séparé par des espaces (w)».
Julik
7
Voir "Entrée générale délimitée" ici ruby-doc.org/docs/ProgrammingRuby/html/language.html
Jared Beck
121
Si la chaîne a des espaces, échappez-les simplement avec \. Ex .:%w(ab\ c def) # => ["ab c", "def"]
Dmitriy
6
Je suppose que cette page aurait également résolu la question: ruby-doc.org/core-2.0/doc/syntax/…
TheConstructor
471

je pense à %w() à un "tableau de mots" - les éléments sont délimités par des espaces et cela renvoie un tableau de chaînes.

Il existe d'autres% littéraux:

  • %r() est une autre façon d'écrire une expression régulière.
  • %q() est une autre façon d'écrire une chaîne entre guillemets simples (et peut être multiligne, ce qui est utile)
  • %Q() donne une chaîne entre guillemets
  • %x() est une commande shell
  • %i() donne un tableau de symboles (Ruby> = 2.0.0)
  • %s()se transforme fooen symbole ( :foo)

Je n'en connais pas d'autres, mais il y a peut-être des cachettes là-dedans ...

Mike Woodhouse
la source
32
Depuis Ruby 2.0.0, vous pouvez également utiliser %i()pour générer un tableau de symboles.
David Tuite
10
Il y a aussi %()(ou %[]ou %{}) qui donne une chaîne entre guillemets doubles et échappe les guillemets doubles, comme %Q(). Par exemple%("sender name" <[email protected]>) # => "\"sender name\" <[email protected]>"
Dennis
59

Il y a aussi %squi vous permet de créer des symboles, par exemple:

%s|some words|          #Same as :'some words'
%s[other words]         #Same as :'other words'
%s_last example_        #Same as :'last example'

Depuis Ruby 2.0.0, vous avez également:

%i( a b c )   # => [ :a, :b, :c ]
%i[ a b c ]   # => [ :a, :b, :c ]
%i_ a b c _   # => [ :a, :b, :c ]
# etc...
Eraden
la source
22

Bien qu'il s'agisse d'un ancien post, la question revient sans cesse et les réponses ne me semblent pas toujours claires, alors voici mes réflexions:

%wet %Wsont des exemples de types d' entrées générales délimitées , qui se rapportent aux tableaux. Il existe d'autres types qui incluent %q,%Q , %r, %xet %i.

La différence entre la version majuscule et minuscule est qu'elle nous donne accès aux fonctionnalités des guillemets simples et doubles. Avec des guillemets simples et (en minuscules) %w, nous n'avons pas d'interpolation de code ( #{someCode}) et une plage limitée de caractères d'échappement qui fonctionnent ( \\,\n ). Avec des guillemets doubles et (majuscules) %Wnous faisons n'avons accès à ces fonctions.

Le délimiteur utilisé peut être n'importe quel caractère, pas seulement la parenthèse ouverte. Jouez avec les exemples ci-dessus pour voir cela en vigueur.

Pour une écriture complète avec des exemples de %wet la liste complète, les caractères d'échappement et les délimiteurs, jetez un œil à " Ruby -% w vs% W - les secrets révélés! "

Mark C
la source
17

Au lieu de %w()nous devrions utiliser%w[]

Selon le guide de style Ruby:

Préférez% w à la syntaxe de tableau littéral lorsque vous avez besoin d'un tableau de mots (chaînes non vides sans espaces et caractères spéciaux). Appliquez cette règle uniquement aux tableaux avec deux éléments ou plus.

# bad
STATES = ['draft', 'open', 'closed']

# good
STATES = %w[draft open closed]

Utilisez les accolades les plus appropriées pour les différents types de pourcentages de littéraux.

[]pour les littéraux de tableau ( %w, %i, %W, %I) car il est aligné avec les littéraux de tableau standard.

# bad
%w(one two three)
%i(one two three)

# good
%w[one two three]
%i[one two three]

Pour en savoir plus, lisez ici .

Rajkaran Mishra
la source
11

Extrait de la documentation de Percent Strings sur http://ruby-doc.org/core/doc/syntax/literals_rdoc.html#label-Percent+Strings :

Outre% (...) qui crée une chaîne, le% peut créer d'autres types d'objets. Comme pour les chaînes, une lettre majuscule permet l'interpolation et les caractères d'échappement tandis qu'une lettre minuscule les désactive.

Ce sont les types de chaînes de pourcentage en rubis:
...
% w : tableau de chaînes

itsnikolay
la source
2
Décidément merci! Je commençais à penser que ça n'existait pas. Les liens rubydoc fournis par d'autres sont rompus.
Gerry
La documentation n'était pas pour ceux-ci n'a pas été incluse dans les RubyDocs pendant un certain temps.
le Tin Man
2

On m'a donné un tas de colonnes à partir d'une feuille de calcul CSV de noms complets d'utilisateurs et je devais garder la mise en forme, avec des espaces. Le moyen le plus simple que j'ai trouvé pour les intégrer lors de l'utilisation de rubis était de faire:

names = %( Porter Smith
Jimmy Jones
Ronald Jackson).split('\n')

Cela met en évidence que %()crée une chaîne comme "Porter Smith\nJimmyJones\nRonald Jackson"et pour obtenir le tableau de splitla chaîne sur le"\n" ["Porter Smith", "Jimmy Jones", "Ronald Jackson"]

Donc, pour répondre aussi à la question d'origine de l'OP, ils auraient pu écrire %(cgi\ spaeinfilename.rb;complex.rb;date.rb).split(';')s'il y en avait spacequand vous voulez que cela spaceexiste dans la sortie finale du tableau.

pjammer
la source