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 %w
significa isso? Você pode me indicar a documentação?
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 %w
significa isso? Você pode me indicar a documentação?
Respostas:
%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 .
%w(ab\ c def) # => ["ab c", "def"]
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 foo
em um símbolo ( :foo
)Eu não conheço outros, mas pode haver alguns por aí ...
%i()
para gerar uma matriz de símbolos.
%()
(ou %[]
ou %{}
) que fornece uma string com aspas duplas e escapa aspas duplas, como %Q()
. Exemplo%("sender name" <sender@example.com>) # => "\"sender name\" <sender@example.com>"
Também existe o %s
que 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...
%W
e%w
permite criar uma matriz de seqüências de caracteres sem usar aspas e vírgulas.
Embora seja um post antigo, a pergunta continua aparecendo e as respostas nem sempre parecem claras para mim, então, eis os meus pensamentos:
%w
e %W
são exemplos de tipos de entrada delimitada geral , relacionados a matrizes. Existem outros tipos que incluem %q
, %Q
, %r
, %x
e %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) %W
que 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 %w
e lista completa, caracteres de escape e delimitadores, consulte " Ruby -% w vs% W - segredos revelados! "
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 .
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
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 split
a 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 space
quando você deseja space
que exista na saída final da matriz.