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 %w
artinya? Bisakah Anda mengarahkan saya ke dokumentasi?
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 %w
artinya? Bisakah Anda mengarahkan saya ke dokumentasi?
Jawaban:
%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 .
%w(ab\ c def) # => ["ab c", "def"]
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 foo
menjadi simbol ( :foo
)Saya tidak tahu yang lain, tapi mungkin ada beberapa yang bersembunyi di sana ...
%i()
untuk menghasilkan lambang simbol.
%()
(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>"
Ada juga %s
yang 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...
%W
dan%w
memungkinkan Anda untuk membuat Array string tanpa menggunakan tanda kutip dan koma.
Meskipun ini adalah posting lama, pertanyaannya terus muncul dan jawabannya tidak selalu jelas bagi saya, jadi, inilah pikiran saya:
%w
dan %W
merupakan contoh tipe Input Terbatas Umum , yang terkait dengan Array. Ada jenis lain yang meliputi %q
, %Q
, %r
, %x
dan %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) %W
kita 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 %w
dan daftar lengkap, karakter melarikan diri dan pembatas, lihat " Ruby -% w vs% W - rahasia terungkap! "
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 .
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
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 split
string 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 space
ketika Anda ingin space
ada di output array akhir.