Que signifie% w (array)?

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 c’est une notation pour écrire un tableau de chaînes séparées par des espaces au lieu de virgules et sans les guillemets. Vous pouvez trouver une liste de manières d’écrire des littéraux dans la référence rapide de zenspider .

Je pense à %w() comme un “tableau de mots” – les éléments sont délimités par des espaces et il renvoie un tableau de chaînes.

Il y a 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 multi-lignes, 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 symbole ( :foo )

Je n’en connais pas d’autres, mais il y en a peut-être un peu partout …

Il y a aussi %s qui 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( abc ) # => [ :a, :b, :c ] %i[ abc ] # => [ :a, :b, :c ] %i_ abc _ # => [ :a, :b, :c ] # etc... 

%W et %w vous permettent de créer un tableau de chaînes sans utiliser de guillemets.

Bien que ce soit un ancien message, la question continue à se poser et les réponses ne me paraissent pas toujours claires. Voici donc mes pensées:

%w et %W sont des exemples de types d’ entrées générales délimitées, liés aux tableaux. Il existe d’autres types qui incluent %q , %Q , %r , %x et %i .

La différence entre les versions majuscules et minuscules est qu’elle nous donne access aux fonctionnalités des guillemets simples et doubles. Avec des guillemets simples et (minuscules) %w , nous n’avons pas d’interpolation de code ( #{someCode} ) et une gamme limitée de caractères d’échappement qui fonctionnent ( \\ , \n ). Avec les guillemets doubles et les majuscules ( %W nous avons access à ces fonctionnalités.

Le délimiteur utilisé peut être n’importe quel caractère, et 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 de la liste complète, échappez aux caractères et aux délimiteurs, regardez ” Ruby -% w vs% W – secrets révélés! ”

Extrait de la documentation des chaînes de pourcentage à l’ adresse http://ruby-doc.org/core/doc/syntax/literals_rdoc.html#label-Percent+Ssortingngs :

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

Ce sont les types de chaînes de pourcentage en ruby:

% w : tableau de chaînes

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

Selon le guide de style Ruby:

Préférez% w à la syntaxe du 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 littéraux en pourcentage.

[] 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 .

J’ai reçu un tas de colonnes d’une feuille de calcul CSV contenant les noms complets des utilisateurs et je devais conserver la mise en forme, avec des espaces. La façon la plus simple de les trouver en utilisant ruby ​​était de:

 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 que vous split la chaîne sur le "\n" ["Porter Smith", "Jimmy Jones", "Ronald Jackson"]

Donc, pour répondre à la question initiale du PO, ils auraient pu écrire %(cgi\ spaeinfilename.rb;complex.rb;date.rb).split(';') s’il y avait de la space quand vous voulez que l’ space existe dans la sortie du tableau final.