Cosa significa% w (array)?


836

Sto guardando la documentazione per FileUtils.

Sono confuso dalla seguente riga:

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

Cosa %wsignifica? Puoi indicarmi la documentazione?

Risposte:


1246

%w(foo bar)è una scorciatoia per ["foo", "bar"]. Significa che è una notazione scrivere una matrice di stringhe separate da spazi anziché da virgole e senza virgolette. Puoi trovare un elenco di modi per scrivere letterali nella guida rapida di zenspider .


199
Inoltre, la parentesi può essere quasi qualsiasi altro carattere come parentesi quadre% w [...], parentesi graffe% w {...} o anche qualcosa come punti esclamativi% w! ...!. Tutti questi hanno lo stesso comportamento (restituendo un array).
Ryanb,

143
Il modo più semplice per ricordare mnemonicamente ciò che ciò significa è "Matrice separata da spazi bianchi (w)".
Julik,

7
Vedi "Input delimitato generale" qui ruby-doc.org/docs/ProgrammingRuby/html/language.html
Jared Beck,

121
Se la stringa ha spazi, sfuggili semplicemente con \. Es .:%w(ab\ c def) # => ["ab c", "def"]
Dmitriy,

6
Immagino che questa pagina avrebbe risolto anche la domanda: ruby-doc.org/core-2.0/doc/syntax/…
TheConstructor

471

Penso %w()a una "matrice di parole": gli elementi sono delimitati da spazi e restituisce una matrice di stringhe.

Esistono altri% letterali:

  • %r() è un altro modo di scrivere un'espressione regolare.
  • %q() è un altro modo per scrivere una stringa tra virgolette singole (e può essere multi-riga, il che è utile)
  • %Q() dà una stringa tra virgolette doppie
  • %x() è un comando di shell
  • %i() fornisce una matrice di simboli (Ruby> = 2.0.0)
  • %s()si trasforma fooin un simbolo ( :foo)

Non ne conosco altri, ma potrebbe esserci un po 'in agguato lì dentro ...


32
A partire da Ruby 2.0.0 puoi anche usare %i()per generare una matrice di simboli.
David Tuite,

10
C'è anche %()(o %[]o %{}) che dà una stringa tra virgolette doppie e sfugge alle virgolette doppie, come %Q(). Ad esempio%("sender name" <sender@example.com>) # => "\"sender name\" <sender@example.com>"
Dennis,

59

C'è anche %squello che ti permette di creare qualsiasi simbolo, ad esempio:

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

Da Ruby 2.0.0 hai anche:

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


22

Sebbene sia un vecchio post, la domanda continua a venire e le risposte non mi sembrano sempre chiare, quindi, ecco i miei pensieri:

%we %Wsono esempi di tipi di input delimitati generali relativi alle matrici. Ci sono altri tipi che includono %q, %Q, %r, %xe %i.

La differenza tra la versione maiuscola e minuscola è che ci dà accesso alle funzionalità delle virgolette singole e doppie. Con virgolette singole e (minuscole) %w, non abbiamo interpolazione di codice ( #{someCode}) e un intervallo limitato di caratteri di escape che funzionano ( \\, \n). Con doppi apici e (maiuscolo) %Wci facciamo abbiamo accesso a queste funzionalità.

Il delimitatore utilizzato può essere qualsiasi carattere, non solo la parentesi aperta. Gioca con gli esempi sopra per vederlo in effetti.

Per un resoconto completo con esempi %we l'elenco completo, caratteri di escape e delimitatori, dai un'occhiata a " Ruby -% w vs% W - i segreti svelati! "


17

Invece di %w()dovremmo usare%w[]

Secondo la guida di stile Ruby:

Preferisci% w alla sintassi dell'array letterale quando hai bisogno di una matrice di parole (stringhe non vuote senza spazi e caratteri speciali in esse). Applicare questa regola solo alle matrici con due o più elementi.

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

# good
STATES = %w[draft open closed]

Utilizzare le parentesi graffe più appropriate per i vari tipi di valori letterali percentuali.

[]per array letterali ( %w, %i, %W, %I) in quanto è allineato con i letterali array standard.

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

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

Per maggiori informazioni leggi qui .


11

Estratto dalla documentazione per Percent Strings su http://ruby-doc.org/core/doc/syntax/literals_rdoc.html#label-Percent+Strings :

Oltre a% (...) che crea una stringa,% può creare altri tipi di oggetto. Come per le stringhe, una lettera maiuscola consente l'interpolazione e caratteri di escape mentre una lettera minuscola li disabilita.

Questi sono i tipi di stringhe percentuali in rubino:
...
% w : Array of Strings


2
Accidenti grazie! Stavo iniziando a pensare che non esistesse. I collegamenti rubydoc forniti da altri sono interrotti.
Gerry,

La documentazione non era per questi non è stata inclusa nel RubyDocs per un bel po '.
Tin Man,

2

Mi è stato dato un mucchio di colonne da un foglio di calcolo CSV con nomi completi di utenti e avevo bisogno di mantenere la formattazione, con spazi. Il modo più semplice che ho trovato per farli entrare mentre usando ruby ​​era quello di fare:

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

Ciò evidenzia che %()crea una stringa simile "Porter Smith\nJimmyJones\nRonald Jackson"e per ottenere l'array su cui si trova splitla stringa"\n" ["Porter Smith", "Jimmy Jones", "Ronald Jackson"]

Quindi, per rispondere anche alla domanda originale dell'OP, avrebbero potuto scrivere %(cgi\ spaeinfilename.rb;complex.rb;date.rb).split(';')se fosse successo spacequando si voleva spaceche esistesse nell'output dell'array finale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.