Apa yang dimaksud dengan% w (array)?


836

Saya sedang melihat dokumentasi untuk FileUtils.

Saya bingung dengan baris berikut:

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

Apa %wartinya? Bisakah Anda mengarahkan saya ke dokumentasi?

Jawaban:


1245

%w(foo bar)adalah jalan pintas untuk ["foo", "bar"]. Artinya adalah notasi untuk menulis array string yang dipisahkan oleh spasi alih-alih koma dan tanpa tanda kutip di sekitarnya. Anda dapat menemukan daftar cara menulis literal di quickref zenspider .


199
Selain itu, tanda kurung dapat berupa hampir semua karakter lain seperti tanda kurung% w [...], kurung kurawal% w {...} atau bahkan sesuatu seperti tanda seru% w! ...!. Semua ini memiliki perilaku yang sama (mengembalikan array).
ryanb

143
Cara termudah untuk secara mnemonik mengingat apa artinya ini adalah "Whitespace (w) separated array".
Julik

7
Lihat "Input Terbatas
Jared Beck

121
Jika string memiliki spasi, lepas saja dengan \. Mis .:%w(ab\ c def) # => ["ab c", "def"]
Dmitriy

6
Tebak halaman ini akan menyelesaikan pertanyaan, juga: ruby-doc.org/core-2.0/doc/syntax/…
TheConstructor

471

Saya anggap %w()sebagai "susunan kata" - elemen dibatasi oleh spasi dan mengembalikan susunan string.

Ada% literal lainnya:

  • %r() adalah cara lain untuk menulis ekspresi reguler.
  • %q() adalah cara lain untuk menulis string yang dikutip tunggal (dan bisa multi-baris, yang berguna)
  • %Q() memberikan string yang dikutip ganda
  • %x() adalah perintah shell
  • %i() memberikan array simbol (Ruby> = 2.0.0)
  • %s()berubah foomenjadi simbol ( :foo)

Saya tidak tahu yang lain, tapi mungkin ada beberapa yang bersembunyi di sana ...


32
Pada Ruby 2.0.0 Anda juga bisa menggunakan %i()untuk menghasilkan lambang simbol.
David Tuite

10
Ada juga %()(atau %[]atau %{}) yang memberikan string dikutip ganda dan lolos dari kutipan ganda, seperti %Q(). Misalnya%("sender name" <sender@example.com>) # => "\"sender name\" <sender@example.com>"
Dennis

59

Ada juga %syang memungkinkan Anda membuat simbol apa saja, misalnya:

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

Sejak Ruby 2.0.0 Anda juga memiliki:

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


22

Meskipun ini adalah posting lama, pertanyaannya terus muncul dan jawabannya tidak selalu jelas bagi saya, jadi, inilah pikiran saya:

%wdan %Wmerupakan contoh tipe Input Terbatas Umum , yang terkait dengan Array. Ada jenis lain yang meliputi %q, %Q, %r, %xdan %i.

Perbedaan antara versi huruf besar dan kecil adalah bahwa ia memberi kita akses ke fitur tanda kutip tunggal dan ganda. Dengan tanda kutip tunggal dan (huruf kecil) %w, kami tidak memiliki interpolasi kode ( #{someCode}) dan sejumlah karakter pelarian yang berfungsi ( \\, \n). Dengan tanda kutip ganda dan (huruf besar) %Wkita lakukan memiliki akses ke fitur ini.

Pembatas yang digunakan dapat berupa karakter apa saja, bukan hanya tanda kurung terbuka. Mainkan dengan contoh di atas untuk melihat efeknya.

Untuk penulisan lengkap dengan contoh %wdan daftar lengkap, karakter melarikan diri dan pembatas, lihat " Ruby -% w vs% W - rahasia terungkap! "


17

Alih-alih %w()sebaiknya kita gunakan%w[]

Menurut panduan gaya Ruby:

Pilih% w ke sintaks array literal saat Anda membutuhkan array kata (string tidak kosong tanpa spasi dan karakter khusus di dalamnya). Terapkan aturan ini hanya untuk array dengan dua elemen atau lebih.

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

# good
STATES = %w[draft open closed]

Gunakan kawat gigi yang paling sesuai untuk berbagai jenis persen literal.

[]untuk literal array ( %w, %i, %W, %I) karena disejajarkan dengan literal array standar.

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

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

Untuk lebih lanjut baca di sini .


11

Dikutip dari dokumentasi untuk Perscent Strings di http://ruby-doc.org/core/doc/syntax/literals_rdoc.html#label-Percent+Strings :

Selain% (...) yang membuat String,% dapat membuat jenis objek lainnya. Seperti halnya string, huruf besar memungkinkan interpolasi dan karakter yang lolos sementara huruf kecil menonaktifkannya.

Ini adalah jenis persen string dalam ruby:
...
% w : Array of Strings


2
Ya ampun, terima kasih! Saya mulai berpikir itu tidak ada. Tautan rubydoc yang disediakan oleh orang lain terputus.
Gerry

Dokumentasi bukan untuk ini tidak termasuk dalam RubyDocs cukup lama.
the Tin Man

2

Saya diberi banyak kolom dari spreadsheet CSV berisi nama lengkap pengguna dan saya perlu menjaga formatnya, dengan spasi. Cara termudah yang saya temukan untuk menggunakannya saat menggunakan ruby ​​adalah dengan melakukannya:

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

Sorotan ini yang %()membuat string seperti "Porter Smith\nJimmyJones\nRonald Jackson"dan untuk mendapatkan array Anda splitstring di"\n" ["Porter Smith", "Jimmy Jones", "Ronald Jackson"]

Jadi untuk menjawab pertanyaan asli OP juga, mereka bisa menulis %(cgi\ spaeinfilename.rb;complex.rb;date.rb).split(';')jika kebetulan ada spaceketika Anda ingin spaceada di output array akhir.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.