O que significa% w (matriz)?

836

Estou olhando a documentação do FileUtils.

Estou confuso com a seguinte linha:

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

O que %wsignifica isso? Você pode me indicar a documentação?

Dane O'Connor
fonte

Respostas:

1245

%w(foo bar)é um atalho para ["foo", "bar"]. Significando que é uma notação escrever uma matriz de cadeias separadas por espaços em vez de vírgulas e sem aspas. Você pode encontrar uma lista de maneiras de escrever literais no quickref do zenspider .

sepp2k
fonte
199
Além disso, o parêntese pode ser quase qualquer outro caractere, como colchetes% w, chaves [...] entre chaves% w {...} ou até algo como pontos de exclamação% w! ...!. Todos eles têm o mesmo comportamento (retornando uma matriz).
Ryanb 13/08/09
143
A maneira mais fácil de lembrar mnemonicamente o que isso significa é "matriz separada por espaço em branco (w)".
Julik
7
Veja "Entrada delimitada geral" aqui ruby-doc.org/docs/ProgrammingRuby/html/language.html
Jared Beck
121
Se a string tiver espaços, apenas escape-os com \. Ex .:%w(ab\ c def) # => ["ab c", "def"]
Dmitriy
6
Acho que esta página também teria resolvido a questão: ruby-doc.org/core-2.0/doc/syntax/…
TheConstructor
471

Penso %w()como uma "matriz de palavras" - os elementos são delimitados por espaços e retornam uma matriz de seqüências de caracteres.

Existem outros% literais:

  • %r() é outra maneira de escrever uma expressão regular.
  • %q() é outra maneira de escrever uma string de aspas simples (e pode ser multilinhas, o que é útil)
  • %Q() fornece uma string de aspas duplas
  • %x() é um comando shell
  • %i() fornece uma matriz de símbolos (Ruby> = 2.0.0)
  • %s()se transforma fooem um símbolo ( :foo)

Eu não conheço outros, mas pode haver alguns por aí ...

Mike Woodhouse
fonte
32
A partir do Ruby 2.0.0, você também pode usar %i()para gerar uma matriz de símbolos.
David Tuite
10
Há também %()(ou %[]ou %{}) que fornece uma string com aspas duplas e escapa aspas duplas, como %Q(). Exemplo%("sender name" <[email protected]>) # => "\"sender name\" <[email protected]>"
Dennis
59

Também existe o %sque permite criar qualquer símbolo, por exemplo:

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

Desde o Ruby 2.0.0, você também tem:

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

Embora seja um post antigo, a pergunta continua aparecendo e as respostas nem sempre parecem claras para mim, então, eis os meus pensamentos:

%we %Wsão exemplos de tipos de entrada delimitada geral , relacionados a matrizes. Existem outros tipos que incluem %q, %Q, %r, %xe %i.

A diferença entre as versões maiúscula e minúscula é que ela nos dá acesso aos recursos de aspas simples e duplas. Com aspas simples e (minúsculas) %w, não temos interpolação de código ( #{someCode}) e um intervalo limitado de caracteres de escape que funcionam ( \\, \n). Com aspas duplas e (maiúsculas) %Wque não têm acesso a esses recursos.

O delimitador usado pode ter qualquer caractere, não apenas o parêntese aberto. Brinque com os exemplos acima para ver isso em vigor.

Para uma redação completa com exemplos %we lista completa, caracteres de escape e delimitadores, consulte " Ruby -% w vs% W - segredos revelados! "

Mark C
fonte
17

Em vez de %w()usarmos%w[]

De acordo com o guia de estilo Ruby:

Prefira% w à sintaxe literal da matriz quando precisar de uma matriz de palavras (cadeias não vazias sem espaços e caracteres especiais). Aplique esta regra apenas a matrizes com dois ou mais elementos.

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

# good
STATES = %w[draft open closed]

Use os colchetes mais adequados para os vários tipos de literais de porcentagem.

[]para literais de matriz ( %w, %i, %W, %I), pois está alinhado com os literais de matriz padrão.

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

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

Para mais leia aqui .

Rajkaran Mishra
fonte
11

Extraído da documentação para Porcentagens de caracteres em http://ruby-doc.org/core/doc/syntax/literals_rdoc.html#label-Percent+Strings :

Além de% (...) que cria uma String, o% pode criar outros tipos de objetos. Como nas seqüências de caracteres, uma letra maiúscula permite interpolação e caracteres de escape enquanto uma letra minúscula os desativa.

Estes são os tipos de seqüências de caracteres de porcentagem em ruby:
...
% w : Matriz de seqüências de caracteres

itsnikolay
fonte
2
Nossa obrigado! Eu estava começando a pensar que não existia. Os links rubydoc fornecidos por outras pessoas estão quebrados.
Gerry
A documentação não era para isso e não foi incluída no RubyDocs por um bom tempo.
o homem de lata
2

Recebi várias colunas de uma planilha CSV com nomes completos de usuários e precisava manter a formatação, com espaços. A maneira mais fácil de encontrá-los enquanto usava ruby ​​era:

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

Isso destaca que %()cria uma sequência como "Porter Smith\nJimmyJones\nRonald Jackson"e para obter a matriz com splita sequência no"\n" ["Porter Smith", "Jimmy Jones", "Ronald Jackson"]

Portanto, para responder também à pergunta original do OP, eles poderiam ter escrito %(cgi\ spaeinfilename.rb;complex.rb;date.rb).split(';')se houvesse spacequando você deseja spaceque exista na saída final da matriz.

pjammer
fonte