Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

หนีตัวละครใน Ruby

ในบทความนี้เราจะมาพูดถึงการหลบหนีของตัวละครใน 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 :)