2009-03-27 10 views
129

Qual è la differenza?Matrici di Ruby:% w vs% W

+13

"% w" è la mia solita risposta a persone che si agitano un po 'troppo sulla leggibilità di Ruby. Funziona sempre. –

+0

ora hai una risposta ancora migliore :-) – errata

+4

Come nota a margine irrilevante, l'URL per questa domanda mi ha confuso per un po 'mentre la pagina si stava caricando. –

risposta

205

% w cita come virgolette singole '' (nessuna interpolazione variabile, meno sequenze di escape), mentre% W cita come virgolette "".

irb(main):001:0> foo="hello" 
=> "hello" 
irb(main):002:0> %W(foo bar baz #{foo}) 
=> ["foo", "bar", "baz", "hello"] 
irb(main):003:0> %w(foo bar baz #{foo}) 
=> ["foo", "bar", "baz", "\#{foo}"] 
+0

L'esempio mostra virgolette per% w. È corretto? – Foton

+0

Sì. Quando stampi l'output, Ruby usa sempre virgolette doppie e caratteri di escape come '#'. ''# {foo}'' e '" \ # {pippo} "' ti danno la stessa stringa, che puoi verificare con ''# {pippo}' ==" \ # {pippo} "' in 'irb' . –

+0

È un po 'di confusione al primo sguardo, ma grazie per la spiegazione. – Foton

19

% W esegue le normali sostituzioni con doppia virgola. % w no.

26

Una domanda che ho trovato per% W vs% w:

greetings = %W(hi hello #{"how do you do"}) 
# => ["hi", "hello", "how do you do"] 
+0

Neat hack, grazie! – akuhn

+9

Anche se in questo caso, è più semplice fare 'greetings =% w (ciao ciao come \ fai \ fai \ ')' – dinjas

10

Anche se un vecchio post, la questione continuano ad arrivare e le risposte non sembrano sempre chiaro per me. Quindi, ecco i miei pensieri.

% w e% W sono esempi di input delimitato generico tipi, relativi agli array. Esistono altri tipi che includono% q,% Q,% r,% x e% i.

La differenza tra lettere maiuscole e minuscole è che ci consente di accedere alle funzioni di virgolette singole e doppie. Con virgolette singole e minuscole% w, non abbiamo alcuna interpolazione del codice (ad es. # {SomeCode}) e un intervallo limitato di caratteri di escape che funzionano (ad es. \, \ N). Con doppie virgolette e maiuscole% W abbiamo do avere accesso a queste funzionalità.

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

per un pieno di scrivere con esempi di% W e l'elenco completo, caratteri di escape e delimitatori - hanno un'occhiata a: http://cyreath.blogspot.com/2014/05/ruby-w-vs-w-secrets-revealed.html

Mark

1

%W viene utilizzato per elementi di array a virgola doppia come %Q, ad esempio,

foo = "!" 
%W{hello world #{foo}} # => ["hello", "world", "!"] 

%w viene utilizzato per elementi di array con virgolette singole come %q.

%w(hello world #{foo}) 
# => ["hello","world", "\#{foo}"]