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 %w
significa? Puoi indicarmi la documentazione?
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 %w
significa? Puoi indicarmi la documentazione?
Risposte:
%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 .
%w(ab\ c def) # => ["ab c", "def"]
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 foo
in un simbolo ( :foo
)Non ne conosco altri, ma potrebbe esserci un po 'in agguato lì dentro ...
%i()
per generare una matrice di simboli.
%()
(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>"
C'è anche %s
quello 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...
%W
e%w
ti permettono di creare una matrice di stringhe senza usare virgolette e virgole.
Sebbene sia un vecchio post, la domanda continua a venire e le risposte non mi sembrano sempre chiare, quindi, ecco i miei pensieri:
%w
e %W
sono esempi di tipi di input delimitati generali relativi alle matrici. Ci sono altri tipi che includono %q
, %Q
, %r
, %x
e %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) %W
ci 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 %w
e l'elenco completo, caratteri di escape e delimitatori, dai un'occhiata a " Ruby -% w vs% W - i segreti svelati! "
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 .
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
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 split
la 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 space
quando si voleva space
che esistesse nell'output dell'array finale.