Elixir - เครื่องหมาย
ในบทนี้เราจะสำรวจสัญลักษณ์ซึ่งเป็นกลไกที่จัดทำโดยภาษาสำหรับการทำงานกับการแสดงข้อความ เครื่องหมายเริ่มต้นด้วยอักขระทิลเดอ (~) ซึ่งตามด้วยตัวอักษร (ซึ่งระบุเครื่องหมาย) แล้วตัวคั่น คุณสามารถเพิ่มตัวปรับเปลี่ยนได้หลังจากตัวคั่นสุดท้าย
Regex
Regexes ใน Elixir คือ sigils เราได้เห็นการใช้งานของพวกเขาในบท String ให้เรานำตัวอย่างอีกครั้งเพื่อดูว่าเราจะใช้ regex ใน Elixir ได้อย่างไร
# A regular expression that matches strings which contain "foo" or
# "bar":
regex = ~r/foo|bar/
IO.puts("foo" =~ regex)
IO.puts("baz" =~ regex)
เมื่อรันโปรแกรมข้างต้นจะให้ผลลัพธ์ดังนี้ -
true
false
เครื่องหมายรองรับ 8 ตัวคั่นที่แตกต่างกัน -
~r/hello/
~r|hello|
~r"hello"
~r'hello'
~r(hello)
~r[hello]
~r{hello}
~r<hello>
เหตุผลที่สนับสนุนตัวคั่นที่แตกต่างกันคือตัวคั่นที่แตกต่างกันสามารถเหมาะสมกับเครื่องหมายต่าง ๆ ได้มากกว่า ตัวอย่างเช่นการใช้วงเล็บสำหรับนิพจน์ทั่วไปอาจเป็นตัวเลือกที่สับสนเนื่องจากสามารถผสมกับวงเล็บภายในนิพจน์ทั่วไปได้ อย่างไรก็ตามวงเล็บอาจมีประโยชน์สำหรับเครื่องหมายอื่น ๆ ดังที่เราจะเห็นในส่วนถัดไป
Elixir รองรับ regexes ที่เข้ากันได้กับ Perl และยังรองรับตัวดัดแปลง คุณสามารถอ่านมากขึ้นเกี่ยวกับการใช้ regexes ที่นี่
สตริงรายการ Char และรายการ Word
นอกเหนือจาก regexes แล้ว Elixir ยังมีสัญลักษณ์ในตัวอีก 3 ตัว ให้เราดูที่ sigils
สตริง
เครื่องหมาย ~ s ใช้ในการสร้างสตริงเช่นเครื่องหมายคำพูดคู่คือ เครื่องหมาย ~ s มีประโยชน์เช่นเมื่อสตริงมีทั้งเครื่องหมายคำพูดคู่และเดี่ยว -
new_string = ~s(this is a string with "double" quotes, not 'single' ones)
IO.puts(new_string)
เครื่องหมายนี้สร้างสตริง เมื่อรันโปรแกรมข้างต้นจะให้ผลลัพธ์ดังนี้ -
"this is a string with \"double\" quotes, not 'single' ones"
รายการ Char
เครื่องหมาย ~ c ใช้เพื่อสร้างรายการถ่าน -
new_char_list = ~c(this is a char list containing 'single quotes')
IO.puts(new_char_list)
เมื่อรันโปรแกรมข้างต้นจะให้ผลลัพธ์ดังนี้ -
this is a char list containing 'single quotes'
รายการคำ
เครื่องหมาย ~ w ใช้ในการสร้างรายการคำ (คำเป็นเพียงสตริงปกติ) ภายในเครื่องหมาย ~ w คำจะถูกคั่นด้วยช่องว่าง
new_word_list = ~w(foo bar bat)
IO.puts(new_word_list)
เมื่อรันโปรแกรมข้างต้นจะให้ผลลัพธ์ดังนี้ -
foobarbat
เครื่องหมาย ~ w ยังยอมรับไฟล์ c, s และ a ตัวปรับแต่ง (สำหรับรายการถ่านสตริงและอะตอมตามลำดับ) ซึ่งระบุประเภทข้อมูลขององค์ประกอบของรายการผลลัพธ์ -
new_atom_list = ~w(foo bar bat)a
IO.puts(new_atom_list)
เมื่อรันโปรแกรมข้างต้นจะให้ผลลัพธ์ดังนี้ -
[:foo, :bar, :bat]
Interpolation and Escaping in Sigils
นอกจากตัวพิมพ์เล็กแล้ว Elixir ยังรองรับสัญลักษณ์ตัวพิมพ์ใหญ่เพื่อจัดการกับอักขระที่หลบหนีและการแก้ไข ในขณะที่ทั้ง ~ s และ ~ S จะส่งคืนสตริง แต่ก่อนหน้านี้อนุญาตให้ใช้รหัส Escape และการแก้ไขในขณะที่ค่าหลังไม่ได้ ให้เราพิจารณาตัวอย่างเพื่อทำความเข้าใจสิ่งนี้ -
~s(String with escape codes \x26 #{"inter" <> "polation"})
# "String with escape codes & interpolation"
~S(String without escape codes \x26 without #{interpolation})
# "String without escape codes \\x26 without \#{interpolation}"
เครื่องหมายกำหนดเอง
เราสามารถสร้าง sigils เองได้ง่ายๆ ในตัวอย่างนี้เราจะสร้างเครื่องหมายเพื่อแปลงสตริงเป็นตัวพิมพ์ใหญ่
defmodule CustomSigil do
def sigil_u(string, []), do: String.upcase(string)
end
import CustomSigil
IO.puts(~u/tutorials point/)
เมื่อเรารันโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -
TUTORIALS POINT
ก่อนอื่นเรากำหนดโมดูลที่เรียกว่า CustomSigil และภายในโมดูลนั้นเราได้สร้างฟังก์ชันที่เรียกว่า sigil_u เนื่องจากไม่มีเครื่องหมาย ~ u ในช่องว่างที่มีอยู่เราจะใช้มัน _u ระบุว่าเราต้องการใช้ u เป็นอักขระหลังเครื่องหมายทิลเดอ นิยามฟังก์ชันต้องใช้สองอาร์กิวเมนต์อินพุตและรายการ