Was bedeutet% w (Array)?

836

Ich schaue mir die Dokumentation für FileUtils an.

Die folgende Zeile verwirrt mich:

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

Was bedeutet das %w? Können Sie mich auf die Dokumentation verweisen?

Däne O'Connor
quelle

Antworten:

1245

%w(foo bar)ist eine Abkürzung für ["foo", "bar"]. Das heißt, es ist eine Notation, ein Array von Zeichenfolgen zu schreiben, die durch Leerzeichen anstelle von Kommas und ohne Anführungszeichen getrennt sind. Eine Liste der Möglichkeiten zum Schreiben von Literalen finden Sie in zenspiders Quickref .

sepp2k
quelle
199
Die Klammer kann auch fast jedes andere Zeichen sein, z. B. eckige Klammern% w [...], geschweifte Klammern% w {...} oder sogar Ausrufezeichen% w! ...!. Alle haben das gleiche Verhalten (Rückgabe eines Arrays).
Ryanb
143
Der einfachste Weg, sich mnemonisch daran zu erinnern, was dies bedeutet, ist "durch Leerzeichen (w) getrenntes Array".
Julik
7
Siehe "General Delimited Input" hier ruby-doc.org/docs/ProgrammingRuby/html/language.html
Jared Beck
121
Wenn der String Leerzeichen enthält, maskieren Sie diese einfach mit \. Bsp.:%w(ab\ c def) # => ["ab c", "def"]
Dmitriy
6
Vermutlich
TheConstructor
471

ich denke an %w() ein "Wortarray" vor - die Elemente werden durch Leerzeichen begrenzt und es wird ein Array von Zeichenfolgen zurückgegeben.

Es gibt andere% Literale:

  • %r() ist eine andere Möglichkeit, einen regulären Ausdruck zu schreiben.
  • %q() ist eine andere Möglichkeit, eine Zeichenfolge in einfachen Anführungszeichen zu schreiben (und kann mehrzeilig sein, was nützlich ist).
  • %Q() gibt eine Zeichenfolge in doppelten Anführungszeichen
  • %x() ist ein Shell-Befehl
  • %i() gibt eine Reihe von Symbolen an (Ruby> = 2.0.0)
  • %s()verwandelt sich fooin ein Symbol ( :foo)

Ich kenne keine anderen, aber vielleicht lauern dort einige herum ...

Mike Woodhouse
quelle
32
Ab Ruby 2.0.0 können Sie auch %i()ein Array von Symbolen generieren.
David Tuite
10
Es gibt auch %()(oder %[]oder %{}), das eine doppelte Anführungszeichenfolge gibt und doppelte Anführungszeichen wie z %Q(). ZB%("sender name" <[email protected]>) # => "\"sender name\" <[email protected]>"
Dennis
59

Dort %skönnen Sie auch beliebige Symbole erstellen, zum Beispiel:

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

Seit Ruby 2.0.0 haben Sie auch:

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

Obwohl es sich um einen alten Beitrag handelt, tauchen immer wieder Fragen auf und die Antworten scheinen mir nicht immer klar zu sein. Hier sind meine Gedanken:

%wund %Wsind Beispiele für allgemein begrenzte Eingabetypen , die auf Arrays beziehen. Es gibt andere Arten , die einschließen %q, %Q, %r, %xund %i.

Der Unterschied zwischen der Groß- und Kleinschreibung besteht darin, dass wir Zugriff auf die Funktionen von einfachen und doppelten Anführungszeichen erhalten. Mit einfachen Anführungszeichen und (Kleinbuchstaben) %whaben wir keine Code-Interpolation ( #{someCode}) und einen begrenzten Bereich von Escape-Zeichen, die funktionieren ( \\, \n). Mit doppelten Anführungszeichen und (Großbuchstaben) tun%W wir das Zugang zu diesen Funktionen.

Das verwendete Trennzeichen kann ein beliebiges Zeichen sein, nicht nur die offene Klammer. Spielen Sie mit den obigen Beispielen, um dies zu sehen.

Eine vollständige Beschreibung mit Beispielen %wund der vollständigen Liste, Escape-Zeichen und Trennzeichen finden Sie unter " Ruby -% w vs% W - Geheimnisse enthüllt! "

Mark C.
quelle
17

Anstelle von %w()sollten wir verwenden%w[]

Laut Ruby Style Guide:

Ziehen Sie% w der Literal-Array-Syntax vor, wenn Sie ein Array von Wörtern benötigen (nicht leere Zeichenfolgen ohne Leerzeichen und Sonderzeichen). Wenden Sie diese Regel nur auf Arrays mit zwei oder mehr Elementen an.

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

# good
STATES = %w[draft open closed]

Verwenden Sie die geschweiften Klammern, die für die verschiedenen Arten von Prozentliteralen am besten geeignet sind.

[]für Array-Literale ( %w, %i, %W, %I), da diese mit den Standard-Array-Literalen ausgerichtet sind.

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

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

Weitere Informationen finden Sie hier .

Rajkaran Mishra
quelle
11

Auszug aus der Dokumentation zu Percent Strings unter http://ruby-doc.org/core/doc/syntax/literals_rdoc.html#label-Percent+Strings :

Neben% (...), das einen String erstellt, kann% auch andere Objekttypen erstellen. Wie bei Zeichenfolgen ermöglicht ein Großbuchstabe Interpolation und maskierte Zeichen, während ein Kleinbuchstabe sie deaktiviert.

Dies sind die Arten von Prozentzeichenfolgen in Ruby:
...
% w : Array von Zeichenfolgen

itsnikolay
quelle
2
Meine Güte, danke! Ich begann zu denken, dass es nicht existierte. Die von anderen bereitgestellten Rubydoc-Links sind fehlerhaft.
Gerry
Die Dokumentation war nicht dafür, dass sie eine ganze Weile nicht in den RubyDocs enthalten war.
der Blechmann
2

Ich erhielt eine Reihe von Spalten aus einer CSV-Tabelle mit vollständigen Benutzernamen und musste die Formatierung mit Leerzeichen beibehalten. Der einfachste Weg, sie bei der Verwendung von Rubin zu finden, war:

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

Dies hebt hervor, dass %()eine Zeichenfolge wie erstellt wird "Porter Smith\nJimmyJones\nRonald Jackson"und um das Array zu erhalten, auf dem Sie splitdie Zeichenfolge haben"\n" ["Porter Smith", "Jimmy Jones", "Ronald Jackson"]

Um auch die ursprüngliche Frage des OP zu beantworten, hätten sie schreiben können, %(cgi\ spaeinfilename.rb;complex.rb;date.rb).split(';')ob es einen spaceZeitpunkt gab, an dem Sie möchten, dass der spacein der endgültigen Array-Ausgabe vorhanden ist.

pjammer
quelle