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 การจับคู่รูปแบบทำงานบนไบนารีและบิตสตริงในลักษณะเดียวกัน