Was bedeutet% w (Array)?

Ich schaue mir die Dokumentation für FileUtils an. Ich bin verwirrt durch die folgende Zeile:

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

Was bedeutet %w ? Kannst du mich auf die Dokumentation hinweisen?

%w(foo bar) ist eine Abkürzung für ["foo", "bar"] . Das bedeutet, dass es eine Notation ist, um ein Array von Strings zu schreiben, die durch Leerzeichen statt durch Kommas und ohne Anführungszeichen um sie herum getrennt sind. Sie können eine Liste von Möglichkeiten zum Schreiben von Literalen in zenspiders Quickref finden .

Ich denke an %w() als “Wort-Array” – die Elemente sind durch Leerzeichen begrenzt und es gibt ein Array von Strings zurück.

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 einfacher Anführungszeichen zu schreiben (und kann mehrzeilig sein, was nützlich ist)
  • %Q() gibt eine Zeichenfolge in doppelten Anführungszeichen an
  • %x() ist ein Shell-Befehl
  • %i() gibt ein Array von Symbolen (Ruby> = 2.0.0)
  • %s() verwandelt foo in ein Symbol ( :foo )

Ich kenne keine anderen, aber da drinnen kann sich jemand lauern …

Es gibt auch %s , mit dem Sie beliebige Symbole erstellen können, 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( abc ) # => [ :a, :b, :c ] %i[ abc ] # => [ :a, :b, :c ] %i_ abc _ # => [ :a, :b, :c ] # etc... 

%W und %w können Sie ein Array mit Strings erstellen, ohne Anführungszeichen und Kommas zu verwenden.

Obwohl es ein alter Post ist, kommt die Frage immer wieder auf, und die Antworten scheinen mir nicht immer klar zu sein, also, hier sind meine Gedanken:

%w und %W sind Beispiele für general-delimierte Eingabetypen, die sich auf Arrays beziehen. Es gibt andere Typen, die %q , %Q , %r , %x und %i .

Der Unterschied zwischen der Groß- und Kleinschreibung besteht darin, dass wir Zugriff auf die functionen von einfachen und doppelten Anführungszeichen erhalten. Mit einfachen Anführungszeichen und (Kleinbuchstaben) %w haben wir keine Code-Interpolation ( #{someCode} ) und einen begrenzten Bereich von Escape-Zeichen, die funktionieren ( \\ , \n ). Mit doppelten Anführungszeichen und (Groß-) %W wir Zugriff auf diese functionen.

Das verwendete Trennzeichen kann ein beliebiges Zeichen sein, nicht nur die öffnende Klammer. Spiele mit den obigen Beispielen, um das zu sehen.

Für eine vollständige Beschreibung mit Beispielen von %w und der vollständigen Liste, Escape-Zeichen und Delimitern, casting Sie einen Blick auf ” Ruby -% w vs.% W – enthülltes Geheimnis! ”

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

Neben% (…), mit dem ein String erstellt wird, kann% andere Arten von Objekten erstellen. Wie bei Strings ermöglicht ein Großbuchstabe Interpolation und Escape-Zeichen, während ein Kleinbuchstabe sie deaktiviert.

Dies sind die Arten von Prozentzeichenfolgen in Ruby:

% w : Array von Strings

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

Laut Ruby Style Guide:

Verwenden Sie% w für die Syntax des Literalarrays, 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 Klammern, die für die verschiedenen Arten von Prozentliteralen am besten geeignet sind.

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

 # bad %w(one two three) %i(one two three) # good %w[one two three] %i[one two three] 

Für mehr lesen Sie hier .

Ich erhielt eine Reihe von Spalten aus einer CSV-Tabelle mit vollständigen Namen von Benutzern, und ich musste die Formatierung mit Leerzeichen beibehalten. Der einfachste Weg, um Ruby zu benutzen, war:

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

Dies hebt hervor, dass %() eine Zeichenkette wie "Porter Smith\nJimmyJones\nRonald Jackson" und um das Array zu erhalten, split Sie die Zeichenkette auf "\n" ["Porter Smith", "Jimmy Jones", "Ronald Jackson"]

%(cgi\ spaeinfilename.rb;complex.rb;date.rb).split(';') die ursprüngliche Frage des OP zu beantworten, hätten sie %(cgi\ spaeinfilename.rb;complex.rb;date.rb).split(';') wenn da space , in dem der space existieren soll die endgültige Array-Ausgabe.