Rust:
ค้นหาความยาวของสตริง
วิธีการ:
Rust ให้คุณใช้ len()
สำหรับความยาวโดยตรง:
fn main() {
let greeting = "Hello, world!";
println!("Length: {}", greeting.len());
}
ผลลัพธ์: Length: 13
แต่ระวัง, len()
นับเป็นไบต์, ไม่ใช่ตัวอักษร สำหรับนับจำนวนตัวอักษร, ใช้ .chars().count()
:
fn main() {
let greeting = "¡Hola, mundo!";
println!("Character count: {}", greeting.chars().count());
}
ผลลัพธ์: Character count: 12
ลงลึก
len()
นับเป็นไบต์เพราะว่าสตริงใน Rust เป็นรหัส UTF-8 โดยประวัติศาสตร์, คอมพิวเตอร์รุ่นแรกใช้ ASCII, ที่แทนแต่ละตัวอักษรด้วยไบต์เดียว UTF-8, อย่างไรก็ตาม, รองรับอักขระหลากหลาย, ใช้ 1 ถึง 4 ไบต์ต่อตัว
เมื่อคุณเรียก len()
, Rust นับไบต์ในสตริง, ซึ่งเร็วแต่ไม่จำเป็นต้องตรงกับจำนวนตัวอักษรเสมอไป ตัวอย่างเช่น, อิโมจิหรือตัวอักษรที่มีเครื่องหมายอักขระต่างๆ นั้นใช้ไบต์มากกว่าหนึ่งไบต์ นั่นเป็นเหตุผลว่าทำไม .chars().count()
จึงสำคัญ — มันวนซ้ำผ่านตัวอักษรและให้จำนวนค่า Unicode scalar, ซึ่งเป็นจำนวนตัวอักษรที่คนส่วนใหญ่คาดหวัง
สำหรับทางเลือก, .chars().count()
มีความแม่นยำแต่ช้าสำหรับสตริงยาวๆ เพราะต้องวนซ้ำผ่านตัวอักษรทุกตัว ถ้าประสิทธิภาพเป็นสิ่งสำคัญ, และคุณมั่นใจว่ากำลังจัดการกับอักขระ ASCII หรือ Unicode ที่มีขนาดคงที่, len()
จึงมีประสิทธิภาพมากกว่า
ในที่สุด, จำไว้ว่าการดัชนีสตริงของ Rust ไม่อนุญาตให้เข้าถึงโดยตรงโดยตำแหน่งตัวอักษร เนื่องจากการทำงานของรหัส UTF-8 Rust ป้องกันการดำเนินการที่อาจทำให้สตริงแตกหรือตัดที่จุดที่ไม่ถูกต้อง ซึ่งอาจไม่แสดงถึงตัวอักษรเต็ม
อ่านเพิ่มเติม
- คู่มือการใช้งานสตริงอย่างเป็นทางการของ Rust: https://doc.rust-lang.org/std/string/
- Rust Book เกี่ยวกับสตริง: https://doc.rust-lang.org/book/ch08-02-strings.html
- เพื่อเข้าใจเพิ่มเติมเกี่ยวกับ UTF-8 และ ASCII, ดูที่ https://tools.ietf.org/html/rfc3629