Question

Je regarde la documentation 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 le %w signifie? Pouvez-vous me montrer à la documentation?

Était-ce utile?

La solution

%w(foo bar) est un raccourci pour ["foo", "bar"]. Ce qui signifie qu'il est une notation d'écrire un tableau de chaînes séparées par des espaces au lieu de virgules et sans les guillemets autour d'eux. Vous pouvez trouver une liste des moyens de littéraux d'écriture dans zenspider de quickref.

Autres conseils

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 unique entre guillemets (et peut être multi-ligne, ce qui est utile)
  • %Q() donne une chaîne double cité
  • %x() est une commande shell
  • %i() donne un tableau de symboles (Ruby> = 2.0.0)
  • %s() se foo un symbole (:foo)

Je ne sais pas d'autres, mais il peut y avoir un qui se cache là-dedans ... autour

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 vous 2.0.0 également:

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

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

Bien qu'il soit un ancien poste, la question continuent d'affluer et les réponses ne semblent pas toujours clair pour moi, donc, voici mes pensées:

%w et %W sont des exemples d'entrée générale Délimité types , qui se rapportent aux tableaux. Il existe d'autres types qui incluent %q, %Q, %r, %x et %i.

La différence entre la version majuscules et minuscules est qu'il nous donne accès aux caractéristiques des guillemets simples et doubles. Avec des guillemets simples et (minuscule) %w, on n'a pas d'interpolation de code (#{someCode}) et un nombre limité de caractères d'échappement qui fonctionnent (\\, \n). Avec des guillemets doubles et (en majuscules) %W nous ne ont accès à ces fonctions.

Le séparateur utilisé peut être un caractère, non seulement la parenthèse ouverte. Jouez avec les exemples ci-dessus pour voir qu'en effet.

Pour une liste complète d'écrire avec des exemples de %w et la liste complète, échapper les caractères et les délimiteurs, jetez un oeil à « Ruby -% p vs% W - secrets révélés "

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

Selon le guide de style Ruby:

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

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

# good
STATES = %w[draft open closed]

Utilisez les accolades qui sont les plus appropriés pour les différents types de littéraux pour cent.

[] pour littéraux de tableau (de %w, %i, %W, %I) tel qu'il est aligné avec le réseau standards littéraux.

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

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

Pour en savoir plus lire .

Extrait de la documentation pour les chaînes Pourcentage http: //ruby-doc.org/core/doc/syntax/literals_rdoc.html#label-Percent+Strings :

  

En plus de% (...) qui crée une chaîne, le% peut créer d'autres types d'objets. Comme dans le cas des chaînes, une lettre majuscule permet l'interpolation et en caractères d'échappement une lettre minuscule les désactive.

     

Ce sont les types de chaînes pour cent en rubis:
  ...
  % p : tableau de chaînes

On m'a donné un tas de colonnes d'une feuille de calcul CSV des noms complets des utilisateurs et je devais conserver le formatage, avec des espaces. La meilleure manière que je trouvais à les obtenir en tout en utilisant Ruby était à 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 que vous split la chaîne sur la "\n" de ["Porter Smith", "Jimmy Jones", "Ronald Jackson"]

Donc, pour répondre à la question initiale de trop l'OP, ils pourraient avoir écrit %(cgi\ spaeinfilename.rb;complex.rb;date.rb).split(';') s'il est arrivé à space quand vous voulez que le space d'exister dans la sortie du tableau final.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top