% 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.