ในบทความนี้เราจะมาพูดถึงการหลบหนีของตัวละครใน Ruby เราจะเรียนรู้วิธีหลีกเลี่ยงตัวละคร วิธีการทำงาน และวิธีหลีกเลี่ยงการหลบหนีโดยสิ้นเชิงสำหรับกรณีการใช้งานบางกรณี ถ้าคุณคิดว่าคุณรู้ทุกอย่างเกี่ยวกับ \
อย่าลืมอ่านทั้งหมดและประหลาดใจ...
มาดำดิ่งกันด้วยการหนีอักขระเป็นสตริง
หนีคำพูด
เมื่อใช้สตริงใน Ruby บางครั้งเราต้องใส่เครื่องหมายคำพูดที่เราเคยใช้กำหนดสตริงไว้ภายในสตริงด้วย เมื่อดำเนินการแล้ว เราสามารถหลีกเลี่ยงอักขระเครื่องหมายคำพูดด้วยแบ็กสแลช \
สัญลักษณ์
# Escape quotes in double quoted strings
"Hello \"world\"!"
=> "Hello \"world\"!"
# Escape quotes in single quoted strings
'Hello \'world\'!'
=> "Hello 'world'!"
ในที่นี้เราจะเห็นว่าค่าดีฟอลต์ของ Ruby เป็นสตริงที่มีเครื่องหมายอัญประกาศคู่สำหรับเอาต์พุต และหลีกเลี่ยงเฉพาะเครื่องหมายอัญประกาศคู่เหล่านั้นในเอาต์พุต
ลำดับการหลบหนี
นอกจากเครื่องหมายคำพูดแล้ว ยังมีสัญลักษณ์อื่นๆ ที่เราสามารถหลีกเลี่ยงได้ในสตริง ตัวอย่างเช่น การขึ้นบรรทัดใหม่จะแสดงด้วย \n
. นี่เรียกว่า "ลำดับการหลบหนี"
"Hello\nworld"
=> "Hello\nworld"
สิ่งที่ได้รับกลับเป็นสตริงเดียวกับที่เราสร้าง แต่อย่างที่คุณเห็น \n
ถูกเน้น แสดงว่าเป็นลำดับการหลบหนี หากตอนนี้เราจะพิมพ์สตริงนี้ เราจะเห็นว่าตัวอักษร \n
ไม่ได้พิมพ์ แต่มีการพิมพ์ขึ้นบรรทัดใหม่แทน
puts "Hello\nworld"
=> Hello
world
สิ่งนี้ใช้ไม่ได้ในสตริงที่ยกมาเดียว \n
ลำดับถูกตีความว่าเป็นตัวอักษร \n
. ในสตริงที่มีเครื่องหมายอัญประกาศคู่ คุณจะต้องหลีกเลี่ยงสัญลักษณ์แบ็กสแลชเพื่อให้ได้ผลลัพธ์เดียวกัน
'\n'
=> "\\n"
ตัวอย่าง Escape Sequence อื่นๆ ที่ทำงานในลักษณะเดียวกัน ได้แก่ \t
, \s
และ \b
ซึ่งเป็นตัวแทนของแท็บ ช่องว่าง และแบ็คสเปซตามลำดับ
อัญประกาศเดี่ยว vs และเครื่องหมายคำพูดคู่
ความแตกต่างระหว่างสตริงที่ยกมาแบบเดี่ยวและแบบคู่ใน Ruby คือวิธีที่คำจำกัดความของสตริงแสดงถึงลำดับการหลบหนี
- ใน สองเท่า สตริงที่ยกมา คุณสามารถเขียน Escape Sequence และ Ruby จะแสดงความหมายที่แปลออกมา
\n
กลายเป็นบรรทัดใหม่ - ใน โสด อย่างไรก็ตาม สตริงที่ยกมา ลำดับ Escape จะถูก Escape และส่งคืนคำจำกัดความตามตัวอักษร
\n
ยังคงเป็น\n
.
สตริงทั้งสองประเภทมีกรณีการใช้งานแน่นอน เป็นไปได้มากที่คุณจะใช้สตริงที่มีเครื่องหมายอัญประกาศคู่กับ Escape Sequence เพื่อใช้ความหมายที่แปลแล้ว การขึ้นบรรทัดใหม่หรือแท็บ
เครื่องหมายอัญประกาศเดี่ยวมีประโยชน์ในการหลีกเลี่ยงการหลบหนีซีเควนซ์ด้วยตนเอง มีประโยชน์สำหรับสาธิตการใช้งานหรือหลีกเลี่ยงการใช้ Escape Sequence โดยไม่ได้ตั้งใจ
puts "Line 1\nLine 2"
=> Line 1
Line 2
puts 'Using a \n we can indicate a newline.'
=> Using a \n we can indicate a newline.
หลีกเลี่ยงการแก้ไข
Ruby รองรับการแก้ไขภายในสตริง แต่อีกครั้งหนึ่ง คำจำกัดความของสตริงไม่ได้ถูกสร้างขึ้นมาเท่ากันทั้งหมด การแก้ไขใช้ได้เฉพาะในสตริงที่มีเครื่องหมายอัญประกาศคู่
ในตัวอย่างโค้ดด้านล่าง เราจะเห็นว่าการแก้ไขทำงานในสตริงที่มีเครื่องหมายอัญประกาศคู่ แต่ Ruby จะหลีกเลี่ยงลำดับการแก้ไขในสตริงที่ยกมาเพียงเส้นเดียว ทำให้ไม่มีประโยชน์
name = "world"
"Hello #{name}"
=> "Hello world"
'Hello #{name}'
=> "Hello \#{name}"
ลักษณะการทำงานนี้ใช้กับ "เวทย์มนตร์" เกือบทุกประเภท อัญประกาศคู่รองรับ แต่อัญประกาศเดี่ยวไม่รองรับ
สัญกรณ์ร้อยละสำหรับสตริง
เครื่องหมายเปอร์เซ็นต์ใน Ruby เป็นสิ่งที่ได้รับแรงบันดาลใจจากภาษาโปรแกรม Perl และทำให้เรามีชวเลขสำหรับคำจำกัดความประเภททั่วไปบางประเภท
ลักษณะการทำงานแบบเดียวกันสำหรับสตริงที่ยกมาแบบเดี่ยวและแบบคู่จะมีผลกับสัญกรณ์เปอร์เซ็นต์ด้วยเช่นกัน
%()
และ%Q()
ประพฤติตัวแบบเดียวกับสตริงที่มีเครื่องหมายอัญประกาศคู่%q()
ทำงานในลักษณะเดียวกับสตริงที่ยกมาเพียงเส้นเดียว
ปัญหาของเครื่องหมายเปอร์เซ็นต์คือตอนนี้คุณต้องหลีกเลี่ยงอักขระในวงเล็บ ()
แทนที่จะใช้เครื่องหมายคำพูดเมื่อวงเล็บไม่สมดุล
ซึ่งเป็นเหตุผลที่ Ruby อนุญาตให้คุณใช้สัญลักษณ์อื่นๆ สำหรับสัญลักษณ์เปอร์เซ็นต์ได้เช่นกัน:%[foo]
, %{foo}
, %-foo-
, %?foo?
ฯลฯ มันยังรองรับ %"foo"
และ %'foo'
.
ในที่นี้เราจะเห็นว่า Ruby หนีสตริงให้เราเมื่อใช้สัญลักษณ์เปอร์เซ็นต์
%(Hello "world"!)
=> "Hello \"world\""
# With unbalanced parenthesis
%(Hello world\)!)
=> "Hello world)!"
# With balanced parenthesis
%(Hello (world)!)
=> "Hello (world)!"
อีกครั้ง ใช้กฎเดียวกันที่นี่ เช่นเดียวกับสตริงที่ยกมาแบบเดี่ยวและแบบคู่ ลำดับ Escape และการแก้ไขจะถูก Escape โดยค่าเริ่มต้นในสตริงที่ยกมาเดี่ยว
name = "world"
%(Hello\n "#{name}"!)
=> "Hello\n \"world\"!"
%q(Hello\n "#{name}"!)
=> "Hello\\n \"\#{name}\"!"
%Q(Hello\n "#{name}"!)
=> "Hello\n \"world\"!"
การหลีกเลี่ยงอักขระในนิพจน์ทั่วไป
อักขระที่หลบหนียังใช้งานได้ในนิพจน์ทั่วไป ในนิพจน์ทั่วไป อักขระหลายตัวแสดงมากกว่าคำจำกัดความตามตัวอักษร
.
เป็นไวด์การ์ดสำหรับอักขระใด ๆ วงเล็บ []
แทนช่วงหรือส่วนที่เลือก วงเล็บ ()
จับคู่นิพจน์ ฯลฯ หากต้องการใช้คำจำกัดความตามตัวอักษร เราสามารถหลีกเลี่ยงได้ด้วยสัญลักษณ์แบ็กสแลช
/Hello \[world\]/
=> /Hello \[world\]/
/\[world\]/ =~ "Hello [world]"
=> 6
ถ้าเราไม่ออกจากวงเล็บ มันก็จะมองหาอักขระใดๆ ระหว่างวงเล็บและหาคู่แรกในอักขระ l
ใน "สวัสดี" ที่ตำแหน่ง 3
/[world]/ =~ "Hello [world]"
=> 2 # zero index
เพื่อเลี่ยงการหลีกหนีจากเครื่องหมายทับ /
ใช้เพื่อกำหนดนิพจน์ทั่วไป เราสามารถใช้สัญลักษณ์เปอร์เซ็นต์อื่นได้
%r{/world/}
=> /\/world\//
ใช้ %r{}
เราสามารถกำหนดนิพจน์ทั่วไปที่เราไม่ต้องหลีกเลี่ยงเครื่องหมายทับ ผลที่ได้คือเราจะเห็นว่า Ruby หนีการฟัน Forward Slash แทนเรา
หนีการขึ้นบรรทัดใหม่
ก่อนหน้านี้เราหลีกเลี่ยงลำดับการยกเว้น "ขึ้นบรรทัดใหม่" \n
ในสตริงใน Ruby คุณรู้หรือไม่ว่าคุณสามารถหลบหนีการขึ้นบรรทัดใหม่ใน Ruby ได้
ตัวอย่างเช่น เรามีบรรทัดที่ยาวมากสำหรับการเรียกใช้เมธอด และสิ่งนี้จะทำลายความยาวบรรทัดสูงสุดของคู่มือสไตล์โค้ดของเรา
ruby_method_with_many_arguments "Hello world", split: " ", join: "\n"
เราสามารถวางอาร์กิวเมนต์ในบรรทัดแยกกันเพื่อให้แต่ละบรรทัดสั้นลง ใช้งานได้ตราบใดที่บรรทัดก่อนหน้าลงท้ายด้วยเครื่องหมายจุลภาค ,
, ตัวดำเนินการเช่นเครื่องหมายบวก +
หรือเป็นส่วนหนึ่งของการเรียกเมธอดที่อยู่ในวงเล็บ ()
.
ruby_method_with_many_arguments "Hello world",
split: " ",
join: "\n"
ruby_method_with_many_arguments(
"Hello world",
split: " ",
join: "\n"
)
หากเราต้องการจัดแนวอาร์กิวเมนต์ทั้งหมดในระดับการเยื้องเดียวกันโดยไม่ต้องใส่วงเล็บ ()
เราสามารถใช้แบ็กสแลช \
เพื่อหนีการขึ้นบรรทัดใหม่
ruby_method_with_many_arguments \
my_string,
split: " ",
join: "\n"
สิ่งที่เราทำในที่นี้ไม่ได้บอกให้ Ruby ออกจากบรรทัดใหม่ แต่คำสั่งจะดำเนินต่อไปในบรรทัดถัดไป
การ Escape ตัวแบ่งบรรทัดในคำจำกัดความของสตริง
การเลี่ยงการสิ้นสุดบรรทัดยังใช้ได้กับสิ่งต่างๆ เช่น คำจำกัดความของสตริง โดยปกติถ้าเรามีสตริงหลายบรรทัด เราก็สามารถใช้เครื่องหมายบวก +
เพื่อรวมสตริงในสองบรรทัด
"foo" +
"bar"
=> "foobar"
สิ่งนี้จะสร้างสตริงสองสายในสองบรรทัดแล้วรวมเป็นหนึ่งเดียว ดังนั้นมันจึงสร้างวัตถุสตริงสามรายการจริงๆ
แทนที่จะใช้เครื่องหมายบวก เราสามารถหลีกเลี่ยงการขึ้นบรรทัดใหม่ด้วยแบ็กสแลชอีกครั้ง
"foo" \
"bar"
=> "foobar"
ผลลัพธ์มันเหมือนเดิมหรือป่าว ?
ในตัวอย่างแรก เรากำลังรวมสตริงใหม่สองสตริงเข้าด้วยกัน ในขณะที่ตัวอย่างที่สอง Ruby จะสร้างเพียงสตริงเดียวเท่านั้น ล่าม Ruby จะเห็นแบ็กสแลช \
เป็นความต่อเนื่องของการกำหนดสตริงและสร้างเพียงหนึ่งสตริงตามสองบรรทัด ดังนั้นมันจึงดียิ่งขึ้นสำหรับการใช้หน่วยความจำของแอปของคุณ
บทสรุป
การหนีอักขระใน Ruby และภาษาโปรแกรมอื่นๆ มากมาย อาจทำให้สับสนได้ ทันใดนั้น อักขระบางตัวรวมกันได้รับความหมายที่แตกต่างกันภายในสตริงที่มีเครื่องหมายอัญประกาศคู่เมื่อเปรียบเทียบกับการใช้ในสตริงที่ยกมาเดี่ยว
หวังว่าคำแนะนำเล็ก ๆ นี้จะช่วยให้คุณเข้าใจวิธีหลีกเลี่ยงตัวละครและลำดับใน Ruby อย่างถูกต้อง ความแตกต่างระหว่างสตริงที่ยกมาแบบ double และ single เป็นกุญแจสำคัญที่นี่
สตริง "เวทย์มนตร์" ของ Escape Sequence และ Interpolation ใช้งานได้จริงในสตริงที่มีเครื่องหมายอัญประกาศคู่ แต่ไม่ใช่ในสตริงที่ใส่เครื่องหมายคำพูดเดี่ยว
นอกจากนี้ยังมีวิธีอื่นในการหลบหนีโค้ดใน Ruby อีกด้วย เครื่องหมายเปอร์เซ็นต์ช่วยให้เราหลีกเลี่ยงการหลีกเลี่ยงอักขระบางตัวตลอดเวลาในสตริงและนิพจน์ทั่วไป
แต่แบ็กสแลชยังมีประโยชน์มากสำหรับการเขียนสตริงหลายบรรทัดและต่อโค้ด Ruby ในบรรทัดถัดไป บางสิ่งที่ฉันใช้บ่อยเพื่อรักษาโค้ดของฉันให้สะอาดและอ่านง่าย
แจ้งให้เราทราบที่ @AppSignal หากคุณต้องการทราบข้อมูลเพิ่มเติม หรือมีคำถามเฉพาะเกี่ยวกับการหลบหนีตัวละครใน Ruby
หมายเหตุด้านสนุก:สำหรับโพสต์นี้ซึ่งเขียนใน Markdown ฉันต้องใช้สัญลักษณ์แบ็กสแลชค่อนข้างมาก เช่นเดียวกับใน Ruby Markdown ช่วยให้สามารถหลบหนีจากอักขระบางตัวได้ โดยปกติใน Markdown คุณไม่สามารถใส่แบ็กสแลชในบล็อคโค้ดได้ เนื่องจากมันหนีจากบล็อคโค้ดเอง ฉันกลับทำให้มันหนีจากอวกาศแทน
`\` # Doesn't work
`\ ` # Works :)