ฉันกำลังดูเอกสารสำหรับ FileUtils
ฉันสับสนโดยบรรทัดต่อไปนี้:
FileUtils.cp %w(cgi.rb complex.rb date.rb), '/usr/lib/ruby/1.6'
อะไร%wหมายถึง? คุณช่วยชี้ทางเอกสารให้ฉันได้ไหม?
ฉันกำลังดูเอกสารสำหรับ FileUtils
ฉันสับสนโดยบรรทัดต่อไปนี้:
FileUtils.cp %w(cgi.rb complex.rb date.rb), '/usr/lib/ruby/1.6'
อะไร%wหมายถึง? คุณช่วยชี้ทางเอกสารให้ฉันได้ไหม?
คำตอบ:
%w(foo bar)["foo", "bar"]เป็นทางลัดสำหรับ หมายความว่ามันเป็นสัญลักษณ์ในการเขียนอาร์เรย์ของสตริงคั่นด้วยช่องว่างแทนเครื่องหมายจุลภาคและไม่มีเครื่องหมายคำพูดล้อมรอบ คุณสามารถค้นหารายการของวิธีการเขียนตัวอักษรในQuickRef zenspider ของ
%w(ab\ c def) # => ["ab c", "def"]
ฉันคิดว่า%w()เป็น "อาร์เรย์คำ" - องค์ประกอบถูกคั่นด้วยช่องว่างและจะส่งกลับอาร์เรย์ของสตริง
มี% ตัวอักษรอื่น ๆ :
%r() เป็นอีกวิธีในการเขียนนิพจน์ทั่วไป%q() เป็นอีกวิธีในการเขียนสตริงที่มีเครื่องหมายคำพูดเดียว (และสามารถเป็นหลายบรรทัดซึ่งมีประโยชน์)%Q() ให้สตริงที่ยกมาสองครั้ง%x() เป็นคำสั่งเชลล์%i() ให้อาร์เรย์ของสัญลักษณ์ (Ruby> = 2.0.0)%s()กลายfooเป็นสัญลักษณ์ ( :foo)ฉันไม่รู้จักคนอื่น แต่อาจมีบางคนแอบซ่อนอยู่ในนั้น ...
%i()เพื่อสร้างอาร์เรย์ของสัญลักษณ์
%()(หรือ%[]หรือ%{}) %Q()ซึ่งจะช่วยให้สายยกคู่และหนีราคาคู่เหมือน เช่น%("sender name" <sender@example.com>) # => "\"sender name\" <sender@example.com>"
นอกจากนี้ยัง%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...
%Wและ%wอนุญาตให้คุณสร้างอาร์เรย์ของสตริงโดยไม่ต้องใช้เครื่องหมายคำพูดและเครื่องหมายจุลภาค
แม้ว่าจะเป็นการโพสต์เก่า แต่คำถามก็ยังคงเกิดขึ้นและคำตอบก็ไม่ชัดเจนสำหรับฉันดังนั้นนี่คือความคิดของฉัน:
%wและ%Wเป็นตัวอย่างของประเภทอินพุตที่คั่นด้วยทั่วไปที่เกี่ยวข้องกับอาร์เรย์ มีชนิดอื่น ๆ ที่มีอยู่%q, %Q, %r, และ%x%i
ความแตกต่างระหว่างตัวพิมพ์ใหญ่และตัวพิมพ์เล็กคือมันทำให้เราสามารถเข้าถึงคุณลักษณะของเครื่องหมายคำพูดเดี่ยวและคู่ ด้วยเครื่องหมายคำพูดเดี่ยวและ (ตัวพิมพ์เล็ก) %wเราไม่มีการแก้ไขรหัส ( #{someCode}) และช่วงอักขระ จำกัด ที่ใช้งานได้ ( \\, \n) ด้วยเครื่องหมายคำพูดคู่และ (ตัวพิมพ์ใหญ่) %Wเราจะสามารถเข้าถึงคุณลักษณะเหล่านี้ได้
ตัวคั่นที่ใช้สามารถเป็นอักขระใด ๆ ไม่ใช่แค่วงเล็บเปิด เล่นกับตัวอย่างด้านบนเพื่อดูว่ามีผล
สำหรับการเขียนแบบเต็มโดยมีตัวอย่างของ%wและรายชื่อตัวละครยกเว้นและตัวคั่นดูที่ " Ruby -% w เทียบกับ% W - เปิดเผยความลับ! "
แทนที่จะเป็น%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]
คัดลอกมาจากเอกสารสำหรับ Percent Strings ที่http://ruby-doc.org/core/doc/syntax/literals_rdoc.html#label-Percent+Strings :
นอกจาก% (... ) ซึ่งสร้างสตริงแล้ว% อาจสร้างวัตถุประเภทอื่น เช่นเดียวกับสตริงตัวอักษรตัวพิมพ์ใหญ่อนุญาตให้มีการแก้ไขและหนีอักขระขณะที่อักษรตัวพิมพ์เล็กปิดการใช้งาน
นี่คือประเภทของสตริงเปอร์เซ็นต์ในทับทิม:
...
% w : Array of Strings
ฉันได้รับคอลัมน์จำนวนมากจากสเปรดชีต 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ให้มีอยู่ในเอาต์พุตอาร์เรย์สุดท้าย