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'
Que signifie le %w
? Pouvez-vous m'indiquer la documentation?
%w(foo bar)
est un raccourci pour ["foo", "bar"]
. Cela signifie que vous devez écrire un tableau de chaînes séparées par des espaces au lieu de virgules et sans guillemets. Vous pouvez trouver une liste de façons d'écrire des littéraux dans quickref de zenspider .
Je pense que %w()
est un "tableau Word" - les éléments sont délimités par des espaces et renvoie un tableau de chaînes.
Il y a d'autres% littéraux:
%r()
est un autre moyen d'écrire une expression régulière.%q()
est un autre moyen 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()
transforme foo
en un symbole (:foo
)Je n'en connais pas d'autres, mais il y en a peut-être qui se cachent là-dedans ...
Il existe également %s
qui vous permet de créer n’importe quel symbole, 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...
%W
AND %w
vous permet de créer un tableau de chaînes sans utiliser de guillemets ou de virgules.
Bien que ce soit un ancien post, la question continue et les réponses ne me semblent pas toujours claires, alors voici ce que je pense:
%w
et %W
sont des exemples de types de saisie générale délimitée , liés aux tableaux. Il existe d'autres types qui incluent %q
, %Q
, %r
, %x
et %i
.
La différence entre les majuscules et les minuscules est qu’elle nous donne accès aux fonctionnalités des guillemets simples et doubles. Avec des guillemets simples et (minuscule) %w
, nous n’avons aucune interpolation de code (#{someCode}
) et un nombre limité de caractères d’échappement qui fonctionnent (\\
, \n
). Avec les guillemets doubles et (majuscule) %W
nous ne avons accès à ces fonctionnalités.
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 description complète avec des exemples de %w
et la liste complète, des caractères d'échappement et des délimiteurs, consultez " Ruby -% w vs% W - secrets révélés! "
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 ni caractères spéciaux). Appliquez cette règle uniquement aux tableaux comportant 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.
[]
pour les littéraux de tableau (%w, %i, %W, %I
), car il est aligné sur 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 plus de lecture ici .
Extrait de la documentation de Percent Strings à l'adresse 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'objet. Comme pour les chaînes de caractères, une lettre majuscule permet une interpolation et des caractères d'échappement tandis qu'une lettre minuscule les désactive.
Voici les types de chaînes de pourcentage en Ruby:
...
% w : Tableau de chaînes
Une feuille de calcul au format CSV contenant des noms complets d’utilisateurs m’a donné beaucoup de colonnes et j’avais besoin de conserver la mise en forme, avec des espaces. Le moyen le plus simple que j'ai trouvé de les utiliser en utilisant Ruby était de le faire:
names = %( Porter Smith
Jimmy Jones
Ronald Jackson).split('\n')
Ceci met en évidence le fait que %()
crée une chaîne telle que "Porter Smith\nJimmyJones\nRonald Jackson"
et pour obtenir le tableau, vous split
la chaîne sur le "\n"
["Porter Smith", "Jimmy Jones", "Ronald Jackson"]
Donc, pour répondre à la question initiale du PO également, ils auraient pu écrire %(cgi\ spaeinfilename.rb;complex.rb;date.rb).split(';')
s'il y avait eu space
lorsque vous voulez que space
existe dans la sortie du tableau final.