จากบทความก่อน ผมได้บอกไว้ว่าในภาษา Rust นั้น String ไม่ได้เป็น Data Types ทั่วไป แต่เราจะมองว่า String นั้นเป็นกลุ่มของ Characters เลย มันเลยมองการเก็บข้อมูลได้เป็น 2 แบบ คือ แบบ Stack Memory และแบบ Heap Memory ซึ่งมีผลกับ performance ในการใช้งานมัน ซึ่งไว้ค่อยอธิบายในอนาคต
เพราะฉนั้นเราสามารถประกาศตัวแปร string ได้ 2 ประเภท คือ
String literal immutable
การประกาศตัวแปรแบบ immutable นั้น เราจะใช้ &str
ในการระบุ type
แน่นอนว่าถ้าหากเราอยากจะเปลี่ยนข้อมูลในตัวแปร text
นั้น เราจะต้องเพิ่ม mut
ไว้หน้าตัวแปร let
เช่นเดียวกับตัวแปรอื่นๆ
แต่ว่า การประกาศตัวแปรแบบ immutable นั้น ไม่สามารถแก้ไข element ของ string ได้ อ่านตอนแรกก็แอบงงนิดๆ ว่า ไอ้โค๊ดด้านบนมันก็แก้ไขได้นะ
เลยลองใช้หลายๆ แบบดูเลย เข้าใจเพิ่มขึ้นมานิดนึง คือ
การประกาศแบบนี้นั้น ไม่สามารถมารถแก้ไข element ได้จริงๆ ซึ่งการแก้ไข element ก็อย่างเช่น
ถ้าเราอยากจะเปลี่ยน text ให้เป็นตัวพิมพ์เล็กทั้งหมด มันก็จะบอกว่าทำไม่ได้ mismatched types
เท่าที่เข้าใจคือ มันแก้ ข้อความในตัวแปรได้เท่านั้น ไป element (องค์ประกอบ) ภายในของมันไม่ได้
เหตุผลที่เป็นอย่างนั้นเพราะว่าจริงๆ แล้ว การประการ &str
แบบนี้ เป็นการทำ String slice
นั่นเอง
การใช้งาน &str
มันจะได้เรื่อง overhead ที่น้อยกว่าอีกแบบหนึ่ง เหมาะกับการใช้งานทั่วไป เก็บค่า string ที่ไม่ค่อยมีการเปลี่ยนแปลง และสามารถการส่งค่า string ไปยัง function ที่ต้องการได้ (pass by value) ซึ่งต่างอีกตัวนึง
String mutable
ตรงตัวเลยเป็น string ที่เราสามารถแก้ไขหรือทำอะไรกับมันก็ได้ การประกาศก็จะแปลกๆ ตาหน่อย นั่นคือ String::from("text")
สังเกตว่า เราสามารถใช้ฟังก์ชั่น to_uppercase()
ได้แล้ว จริงๆ แล้วเรายังมีคำสั่งอื่นๆ ให้ใช้อีก เช่น
len()
: ความยาวของ stringis_empty()
: string ว่างหรือไม่contains()
: ค้นหา substringto_uppercase()
: แปลงเป็นตัวพิมพ์ใหญ่to_lowercase()
: แปลงเป็นตัวพิมพ์เล็ก
การใช้งาน String
มันจะมี overhead ที่มากกว่าอีกแบบแรก และเหมาะสำหรับการใช้งานที่ต้องการแก้ไข string บ่อยๆ หากเราต้องการที่จะเก็บค่า string ที่มีการเปลี่ยนแปลง หรือต้องมีการแปลง string ก็ให้ใช้ตัวนี้
ส่วนวิธีการส่งค่าไปยัง function อื่นจะอยู่ในรูปแบบของการ pass by reference แทน