Elixir - สตริง
สตริงใน Elixir ถูกแทรกระหว่างเครื่องหมายคำพูดคู่และมีการเข้ารหัสเป็น UTF-8 ไม่เหมือนกับ C และ C ++ ที่สตริงเริ่มต้นจะเข้ารหัส ASCII และมีเพียง 256 อักขระที่แตกต่างกัน UTF-8 ประกอบด้วยจุดรหัส 1,112,064 จุด ซึ่งหมายความว่าการเข้ารหัส UTF-8 ประกอบด้วยอักขระที่เป็นไปได้ต่างๆ เนื่องจากสตริงใช้ utf-8 เราจึงสามารถใช้สัญลักษณ์เช่นö, łเป็นต้น
สร้างสตริง
ในการสร้างตัวแปรสตริงเพียงแค่กำหนดสตริงให้กับตัวแปร -
str = "Hello world"
หากต้องการพิมพ์ลงในคอนโซลของคุณเพียงโทร IO.puts ฟังก์ชั่นและส่งผ่านตัวแปร str -
str = str = "Hello world"
IO.puts(str)
โปรแกรมข้างต้นสร้างผลลัพธ์ต่อไปนี้ -
Hello World
สตริงว่าง
คุณสามารถสร้างสตริงว่างโดยใช้สตริงลิเทอรัล "". ตัวอย่างเช่น,
a = ""
if String.length(a) === 0 do
IO.puts("a is an empty string")
end
โปรแกรมข้างต้นสร้างผลลัพธ์ต่อไปนี้
a is an empty string
การแก้ไขสตริง
การแก้ไขสตริงเป็นวิธีสร้างค่าสตริงใหม่จากการผสมของค่าคงที่ตัวแปรลิเทอรัลและนิพจน์โดยรวมค่าไว้ในลิเทอรัลสตริง Elixir รองรับการแก้ไขสตริงเพื่อใช้ตัวแปรในสตริงเมื่อเขียนให้ห่อด้วยวงเล็บปีกกาและใส่เครื่องหมายวงเล็บปีกกาด้วยเครื่องหมาย'#' ลงชื่อ.
ตัวอย่างเช่น,
x = "Apocalypse"
y = "X-men #{x}"
IO.puts(y)
สิ่งนี้จะรับค่าของ x และแทนที่ด้วย y โค้ดด้านบนจะสร้างผลลัพธ์ต่อไปนี้ -
X-men Apocalypse
การต่อสายอักขระ
เราได้เห็นการใช้การต่อสตริงในบทก่อน ๆ แล้ว ตัวดำเนินการ '<>' ใช้เพื่อต่อสายอักขระใน Elixir ในการเชื่อม 2 สตริงเข้าด้วยกัน
x = "Dark"
y = "Knight"
z = x <> " " <> y
IO.puts(z)
โค้ดด้านบนสร้างผลลัพธ์ต่อไปนี้ -
Dark Knight
ความยาวสตริง
เพื่อให้ได้ความยาวของสตริงเราใช้ String.lengthฟังก์ชัน ส่งสตริงเป็นพารามิเตอร์และจะแสดงขนาดของมัน ตัวอย่างเช่น,
IO.puts(String.length("Hello"))
เมื่อรันโปรแกรมด้านบนจะให้ผลลัพธ์ดังนี้ -
5
การย้อนกลับสตริง
ในการย้อนกลับสตริงให้ส่งผ่านไปยังฟังก์ชัน String.reverse ตัวอย่างเช่น,
IO.puts(String.reverse("Elixir"))
โปรแกรมข้างต้นสร้างผลลัพธ์ต่อไปนี้ -
rixilE
การเปรียบเทียบสตริง
ในการเปรียบเทียบ 2 สตริงเราสามารถใช้ตัวดำเนินการ == หรือ === ตัวอย่างเช่น,
var_1 = "Hello world"
var_2 = "Hello Elixir"
if var_1 === var_2 do
IO.puts("#{var_1} and #{var_2} are the same")
else
IO.puts("#{var_1} and #{var_2} are not the same")
end
โปรแกรมข้างต้นสร้างผลลัพธ์ต่อไปนี้ -
Hello world and Hello elixir are not the same.
การจับคู่สตริง
เราได้เห็นการใช้ตัวดำเนินการจับคู่สตริง = ~ แล้ว หากต้องการตรวจสอบว่าสตริงตรงกับนิพจน์ทั่วไปหรือไม่เรายังสามารถใช้ตัวดำเนินการจับคู่สตริงหรือ String.match? ฟังก์ชัน ตัวอย่างเช่น,
IO.puts(String.match?("foo", ~r/foo/))
IO.puts(String.match?("bar", ~r/foo/))
โปรแกรมข้างต้นสร้างผลลัพธ์ต่อไปนี้ -
true
false
สิ่งเดียวกันนี้สามารถทำได้โดยใช้ตัวดำเนินการ = ~ ตัวอย่างเช่น,
IO.puts("foo" =~ ~r/foo/)
โปรแกรมข้างต้นสร้างผลลัพธ์ต่อไปนี้ -
true
ฟังก์ชันสตริง
Elixir รองรับฟังก์ชั่นจำนวนมากที่เกี่ยวข้องกับสตริงซึ่งบางส่วนที่ใช้มากที่สุดแสดงอยู่ในตารางต่อไปนี้
ซีเนียร์ | ฟังก์ชั่นและวัตถุประสงค์ |
---|---|
1 | at(string, position) ส่งคืนกราฟที่ตำแหน่งของสตริง utf8 ที่กำหนด หากตำแหน่งมีค่ามากกว่าความยาวสตริงก็จะส่งกลับค่า nil |
2 | capitalize(string) แปลงอักขระตัวแรกในสตริงที่กำหนดเป็นตัวพิมพ์ใหญ่และส่วนที่เหลือเป็นตัวพิมพ์เล็ก |
3 | contains?(string, contents) ตรวจสอบว่าสตริงมีเนื้อหาที่กำหนดหรือไม่ |
4 | downcase(string) แปลงอักขระทั้งหมดในสตริงที่กำหนดเป็นตัวพิมพ์เล็ก |
5 | ends_with?(string, suffixes) ส่งคืนจริงหากสตริงลงท้ายด้วยส่วนต่อท้ายที่กำหนด |
6 | first(string) ส่งคืน grapheme แรกจากสตริง utf8 ไม่มีถ้าสตริงว่าง |
7 | last(string) ส่งคืน grapheme สุดท้ายจากสตริง utf8 ไม่มีถ้าสตริงว่างเปล่า |
8 | replace(subject, pattern, replacement, options \\ []) ส่งคืนสตริงใหม่ที่สร้างขึ้นโดยแทนที่การเกิดขึ้นของรูปแบบในหัวเรื่องด้วยการแทนที่ |
9 | slice(string, start, len) ส่งคืนสตริงย่อยที่เริ่มต้นที่จุดเริ่มต้นออฟเซ็ตและของความยาวเลน |
10 | split(string) แบ่งสตริงออกเป็นสตริงย่อยที่ช่องว่าง Unicode แต่ละรายการโดยละเว้นช่องว่างนำหน้าและต่อท้าย กลุ่มของช่องว่างจะถือว่าเป็นเหตุการณ์เดียว การแบ่งแยกจะไม่เกิดขึ้นบนช่องว่างที่ไม่ทำลาย |
11 | upcase(string) แปลงอักขระทั้งหมดในสตริงที่กำหนดเป็นตัวพิมพ์ใหญ่ |
ไบนารี
ไบนารีเป็นเพียงลำดับของไบต์ ไบนารีถูกกำหนดโดยใช้<< >>. ตัวอย่างเช่น:
<< 0, 1, 2, 3 >>
แน่นอนว่าไบต์เหล่านั้นสามารถจัดระเบียบด้วยวิธีใดก็ได้แม้จะอยู่ในลำดับที่ไม่ได้ทำให้เป็นสตริงที่ถูกต้องก็ตาม ตัวอย่างเช่น,
<< 239, 191, 191 >>
สตริงยังเป็นไบนารี และตัวดำเนินการต่อสตริง<> เป็นตัวดำเนินการต่อไบนารี:
IO.puts(<< 0, 1 >> <> << 2, 3 >>)
โค้ดด้านบนสร้างผลลัพธ์ต่อไปนี้ -
<< 0, 1, 2, 3 >>
สังเกตอักขระł เนื่องจากมีการเข้ารหัส utf-8 การแสดงอักขระนี้จึงใช้เวลา 2 ไบต์
เนื่องจากตัวเลขแต่ละตัวที่แสดงในไบนารีมีความหมายว่าเป็นไบต์เมื่อค่านี้เพิ่มขึ้นจาก 255 จึงถูกตัดทอน เพื่อป้องกันสิ่งนี้เราใช้ตัวปรับขนาดเพื่อระบุจำนวนบิตที่เราต้องการให้ตัวเลขนั้นใช้ ตัวอย่างเช่น -
IO.puts(<< 256 >>) # truncated, it'll print << 0 >>
IO.puts(<< 256 :: size(16) >>) #Takes 16 bits/2 bytes, will print << 1, 0 >>
โปรแกรมข้างต้นจะสร้างผลลัพธ์ดังต่อไปนี้ -
<< 0 >>
<< 1, 0 >>
นอกจากนี้เรายังสามารถใช้ตัวปรับแต่ง utf8 หากอักขระเป็นจุดรหัสก็จะถูกสร้างขึ้นในเอาต์พุต อื่นเป็นไบต์ -
IO.puts(<< 256 :: utf8 >>)
โปรแกรมข้างต้นสร้างผลลัพธ์ต่อไปนี้ -
Ā
เรายังมีฟังก์ชันที่เรียกว่า is_binaryที่ตรวจสอบว่าตัวแปรที่กำหนดเป็นไบนารีหรือไม่ โปรดทราบว่าเฉพาะตัวแปรที่จัดเก็บเป็นทวีคูณของ 8 บิตเท่านั้นที่เป็นไบนารี
บิตสตริง
หากเรากำหนดไบนารีโดยใช้ตัวปรับขนาดและส่งผ่านค่าที่ไม่ใช่ผลคูณของ 8 เราจะจบลงด้วยบิตสตริงแทนที่จะเป็นไบนารี ตัวอย่างเช่น,
bs = << 1 :: size(1) >>
IO.puts(bs)
IO.puts(is_binary(bs))
IO.puts(is_bitstring(bs))
โปรแกรมข้างต้นสร้างผลลัพธ์ต่อไปนี้ -
<< 1::size(1) >>
false
true
ซึ่งหมายความว่าตัวแปรนั้น bsไม่ใช่ไบนารี แต่เป็นบิตสตริง นอกจากนี้เรายังสามารถพูดได้ว่าไบนารีเป็นบิตสตริงที่จำนวนบิตหารด้วย 8 การจับคู่รูปแบบทำงานบนไบนารีและบิตสตริงในลักษณะเดียวกัน