% W (dizi) ne anlama geliyor?


836

FileUtils belgelerine bakıyorum.

Aşağıdaki satırla kafam karıştı:

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

Ne anlama %wgeliyor? Beni belgelere yönlendirebilir misin?

Yanıtlar:


1245

%w(foo bar)için bir kısayoldur ["foo", "bar"]. Yani, virgül yerine boşluklarla ayrılmış ve etraflarında tırnak işaretleri olmadan bir dizi dizeyi yazmak bir gösterimdir. Zenspider'ın quickref'inde literal yazmanın yollarının bir listesini bulabilirsiniz .


199
Ayrıca, parantez% w [...] köşeli parantezler,% w {...} kıvrık parantezler veya% w! ...! Ünlem işaretleri gibi hemen hemen her karakter olabilir. Bunların hepsi aynı davranışa sahiptir (bir dizi döndürme).
ryanb

143
Bunun ne anlama geldiğini hatırlamanın en kolay yolu "Boşluk (w) ayrılmış dizi" dir.
Julik

7
Bkz. "Genel Sınırlı
Jared Beck

121
Dizenin boşlukları varsa, \. Örn .:%w(ab\ c def) # => ["ab c", "def"]
Dmitriy

6
Sanırım bu sayfa da sorunu çözerdi
TheConstructor

471

Ben %w()bir "kelime dizisi" olarak düşünüyorum - elemanları boşlukları ile sınırlandırılmış ve dizeleri bir dizi döndürür.

Diğer% değişmez değerler var:

  • %r() normal bir ifade yazmanın başka bir yoludur.
  • %q() tek tırnaklı bir dize yazmanın başka bir yoludur (ve yararlı olan çok satırlı olabilir)
  • %Q() çift ​​tırnaklı bir dize verir
  • %x() bir kabuk komutudur
  • %i() bir dizi sembol verir (Ruby> = 2.0.0)
  • %s()foosembole dönüşür ( :foo)

Baţka kimseyi tanýmýyorum, ama orada biraz gizleniyor olabilir ...


32
Ruby 2.0.0'dan itibaren %i()bir dizi sembol oluşturmak için de kullanabilirsiniz .
David Tuite

10
Ayrıca çift ​​tırnaklı bir dize veren ve gibi çift tırnak işareti veren %()(veya %[]veya %{}) vardır %Q(). Örn%("sender name" <sender@example.com>) # => "\"sender name\" <sender@example.com>"
Dennis

59

Ayrıca %sherhangi bir sembol oluşturmanıza izin veren de vardır, örneğin:

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

Ruby 2.0.0'dan beri:

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


22

Eski bir yazı olmasına rağmen, soru ortaya çıkıyor ve cevaplar her zaman net görünmüyor, bu yüzden düşüncelerim:

%wve Diziler ile ilgili %WGenel Sınırlı Girdi türlerinin örnekleridir . İçeren diğer türleri vardır %q, %Q, %r, %xve %i.

Büyük ve küçük harf arasındaki fark, tek ve çift tırnak özelliklerine erişmemizi sağlamasıdır. Tek tırnak ve (küçük harf) ile %w, kod enterpolasyonu ( #{someCode}) ve çalışan ( \\, \n) sınırlı kaçış karakterleri aralığımız yoktur . Çift tırnak ve (büyük harf) ile %Wbiz yapmak bu özelliklere erişebilir.

Kullanılan sınırlayıcı, sadece açık parantez değil, herhangi bir karakter olabilir. Etkili olduğunu görmek için yukarıdaki örneklerle oynayın.

Örnekleri %wve tam listeyi tam olarak yazmak için , kaçış karakterleri ve sınırlayıcıları, " Ruby -% w vs% W - sırlar açığa çıktı! "


17

Bunun yerine %w()kullanmalıyız%w[]

Ruby stil rehberine göre:

Bir kelime dizisine ihtiyacınız olduğunda% w değerini değişmez dizi sözdizimine tercih edin (içinde boşluklar ve özel karakterler olmayan boş olmayan dizeler). Bu kuralı yalnızca iki veya daha fazla öğeye sahip dizilere uygulayın.

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

# good
STATES = %w[draft open closed]

Çeşitli yüzde değişmez değerleri için en uygun parantezleri kullanın.

[]dizi değişmezleri ( %w, %i, %W, %I) için, standart dizi değişmezleriyle hizalandığından.

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

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

Daha fazlası için burayı okuyun .


11

De yüzde Yaylı belgelerinde den alınmıştır http://ruby-doc.org/core/doc/syntax/literals_rdoc.html#label-Percent+Strings :

Bir String oluşturan% (...) öğesinin yanı sıra,% başka nesne türleri de oluşturabilir. Dizelerde olduğu gibi, büyük harf de enterpolasyona ve çıkış karakterlerine izin verirken küçük harf harfleri devre dışı bırakır.

Bunlar yakutta yüzde dizeleridir:
...
% w : Dizeler Dizisi


2
Tanrım, teşekkürler! Var olmadığını düşünmeye başlamıştım. Başkaları tarafından sağlanan rubydoc bağlantıları kopmuştur.
Gerry

Belgeler bir süredir RubyDocs'a dahil edilmedi.
Tin Man

2

CSV e-tablosundan kullanıcıların tam adlarını içeren bir grup sütun verildi ve biçimlendirmeyi boşluklarla birlikte saklamam gerekiyordu. Yakut kullanırken onları içeri almanın en kolay yolu:

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

Bu %(), bir dizeyi oluşturan "Porter Smith\nJimmyJones\nRonald Jackson"ve diziyi size splitdizede almak için vurgulamaktadır ."\n" ["Porter Smith", "Jimmy Jones", "Ronald Jackson"]

Bu yüzden OP'nin orijinal sorusunu da cevaplamak için , son dizi çıktısında var olmasını istediğinizde %(cgi\ spaeinfilename.rb;complex.rb;date.rb).split(';')olup olmadığını yazmış olabilirler .spacespace

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.