% w (อาร์เรย์) หมายถึงอะไร


836

ฉันกำลังดูเอกสารสำหรับ FileUtils

ฉันสับสนโดยบรรทัดต่อไปนี้:

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

อะไร%wหมายถึง? คุณช่วยชี้ทางเอกสารให้ฉันได้ไหม?

คำตอบ:


1245

%w(foo bar)["foo", "bar"]เป็นทางลัดสำหรับ หมายความว่ามันเป็นสัญลักษณ์ในการเขียนอาร์เรย์ของสตริงคั่นด้วยช่องว่างแทนเครื่องหมายจุลภาคและไม่มีเครื่องหมายคำพูดล้อมรอบ คุณสามารถค้นหารายการของวิธีการเขียนตัวอักษรในQuickRef zenspider ของ


199
นอกจากนี้วงเล็บยังสามารถเป็นอักขระอื่น ๆ ได้เช่นวงเล็บเหลี่ยม% w [... ], วงเล็บปีกกา% w {... } หรือแม้แต่เครื่องหมายอัศเจรีย์% w! ... ! สิ่งเหล่านี้มีพฤติกรรมเหมือนกัน (คืนอาเรย์)
ryanb

143
วิธีที่ง่ายที่สุดในการจำความหมายนี้คือ "ช่องว่าง (w) ที่แยกต่างหาก"
Julik

7
ดู "อินพุตที่คั่นด้วยทั่วไป" ได้ที่นี่ruby-doc.org/docs/ProgrammingRuby/html/language.html
Jared Beck

121
ถ้าสตริงมีช่องว่างให้หนีด้วย \ เช่น.%w(ab\ c def) # => ["ab c", "def"]
Dmitriy

6
เดาว่าหน้านี้จะแก้ไขคำถามด้วยเช่นกัน: ruby-doc.org/core-2.0/doc/syntax/ ......
TheConstructor

471

ฉันคิดว่า%w()เป็น "อาร์เรย์คำ" - องค์ประกอบถูกคั่นด้วยช่องว่างและจะส่งกลับอาร์เรย์ของสตริง

มี% ตัวอักษรอื่น ๆ :

  • %r() เป็นอีกวิธีในการเขียนนิพจน์ทั่วไป
  • %q() เป็นอีกวิธีในการเขียนสตริงที่มีเครื่องหมายคำพูดเดียว (และสามารถเป็นหลายบรรทัดซึ่งมีประโยชน์)
  • %Q() ให้สตริงที่ยกมาสองครั้ง
  • %x() เป็นคำสั่งเชลล์
  • %i() ให้อาร์เรย์ของสัญลักษณ์ (Ruby> = 2.0.0)
  • %s()กลายfooเป็นสัญลักษณ์ ( :foo)

ฉันไม่รู้จักคนอื่น แต่อาจมีบางคนแอบซ่อนอยู่ในนั้น ...


32
ในฐานะของ Ruby 2.0.0 คุณยังสามารถใช้%i()เพื่อสร้างอาร์เรย์ของสัญลักษณ์
David Tuite

10
นอกจากนี้ยังมี%()(หรือ%[]หรือ%{}) %Q()ซึ่งจะช่วยให้สายยกคู่และหนีราคาคู่เหมือน เช่น%("sender name" <sender@example.com>) # => "\"sender name\" <sender@example.com>"
เดนนิส

59

นอกจากนี้ยัง%sช่วยให้คุณสร้างสัญลักษณ์ใด ๆ ตัวอย่างเช่น:

%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 คุณก็มี:

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


22

แม้ว่าจะเป็นการโพสต์เก่า แต่คำถามก็ยังคงเกิดขึ้นและคำตอบก็ไม่ชัดเจนสำหรับฉันดังนั้นนี่คือความคิดของฉัน:

%wและ%Wเป็นตัวอย่างของประเภทอินพุตที่คั่นด้วยทั่วไปที่เกี่ยวข้องกับอาร์เรย์ มีชนิดอื่น ๆ ที่มีอยู่%q, %Q, %r, และ%x%i

ความแตกต่างระหว่างตัวพิมพ์ใหญ่และตัวพิมพ์เล็กคือมันทำให้เราสามารถเข้าถึงคุณลักษณะของเครื่องหมายคำพูดเดี่ยวและคู่ ด้วยเครื่องหมายคำพูดเดี่ยวและ (ตัวพิมพ์เล็ก) %wเราไม่มีการแก้ไขรหัส ( #{someCode}) และช่วงอักขระ จำกัด ที่ใช้งานได้ ( \\, \n) ด้วยเครื่องหมายคำพูดคู่และ (ตัวพิมพ์ใหญ่) %Wเราจะสามารถเข้าถึงคุณลักษณะเหล่านี้ได้

ตัวคั่นที่ใช้สามารถเป็นอักขระใด ๆ ไม่ใช่แค่วงเล็บเปิด เล่นกับตัวอย่างด้านบนเพื่อดูว่ามีผล

สำหรับการเขียนแบบเต็มโดยมีตัวอย่างของ%wและรายชื่อตัวละครยกเว้นและตัวคั่นดูที่ " Ruby -% w เทียบกับ% W - เปิดเผยความลับ! "


17

แทนที่จะเป็น%w()เราควรใช้%w[]

ตามคู่มือสไตล์ทับทิม:

ต้องการ% w ไปยังไวยากรณ์อาร์เรย์ตัวอักษรเมื่อคุณต้องการอาร์เรย์ของคำ (สตริงที่ไม่ว่างโดยไม่มีช่องว่างและอักขระพิเศษในพวกเขา) ใช้กฎนี้กับอาร์เรย์ที่มีองค์ประกอบสองรายการขึ้นไปเท่านั้น

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

# good
STATES = %w[draft open closed]

ใช้วงเล็บปีกกาที่เหมาะสมที่สุดสำหรับตัวอักษรเปอร์เซนต์ชนิดต่างๆ

[]สำหรับตัวอักษรอาร์เรย์ ( %w, %i, %W, %I) ตามที่สอดคล้องกับตัวอักษรอาร์เรย์มาตรฐาน

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

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

สำหรับข้อมูลเพิ่มเติมอ่านที่นี่


11

คัดลอกมาจากเอกสารสำหรับ Percent Strings ที่http://ruby-doc.org/core/doc/syntax/literals_rdoc.html#label-Percent+Strings :

นอกจาก% (... ) ซึ่งสร้างสตริงแล้ว% อาจสร้างวัตถุประเภทอื่น เช่นเดียวกับสตริงตัวอักษรตัวพิมพ์ใหญ่อนุญาตให้มีการแก้ไขและหนีอักขระขณะที่อักษรตัวพิมพ์เล็กปิดการใช้งาน

นี่คือประเภทของสตริงเปอร์เซ็นต์ในทับทิม:
...
% w : Array of Strings


2
Geez ขอบคุณ! ฉันเริ่มคิดว่ามันไม่มีอยู่จริง ลิงก์ rubydoc ที่ผู้อื่นจัดหาให้นั้นเสีย
เจอร์รี่

เอกสารไม่ได้มีไว้สำหรับสิ่งเหล่านี้ไม่ได้รวมอยู่ใน RubyDocs มาระยะหนึ่งแล้ว
มนุษย์ดีบุก

2

ฉันได้รับคอลัมน์จำนวนมากจากสเปรดชีต CSV ชื่อเต็มของผู้ใช้และฉันจำเป็นต้องจัดรูปแบบโดยเว้นวรรค วิธีที่ง่ายที่สุดที่ฉันพบในการใช้ทับทิมคือ:

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

ไฮไลต์นี้ที่%()สร้างสตริงที่เหมือน"Porter Smith\nJimmyJones\nRonald Jackson"และเพื่อให้ได้อาร์เรย์ของคุณsplitเป็นสตริง"\n" ["Porter Smith", "Jimmy Jones", "Ronald Jackson"]

ดังนั้นเพื่อตอบคำถามเดิมของ OP ด้วยพวกเขาอาจเขียนได้%(cgi\ spaeinfilename.rb;complex.rb;date.rb).split(';')ว่ามีอะไรเกิดขึ้นspaceเมื่อคุณต้องการspaceให้มีอยู่ในเอาต์พุตอาร์เรย์สุดท้าย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.