String
String là kiểu dữ liệu chuẩn sử dụng để lưu trữ chuỗi UTF-8 trên bộ nhớ heap, có thể được mở rộng:
fn main() { let mut s1 = String::new(); s1.push_str("Xin chào"); println!("s1: độ dài = {}, kích thước = {}", s1.len(), s1.capacity()); let mut s2 = String::with_capacity(s1.len() + 1); s2.push_str(&s1); s2.push('!'); println!("s2: độ dài = {}, kích thước = {}", s2.len(), s2.capacity()); let s3 = String::from("🇻🇳"); println!("s3: độ dài = {}, số ký tự = {}", s3.len(), s3.chars().count()); }
String implement Deref<Target = str>, có nghĩa tất cả các hàm của str đều có thể được gọi trên một biến kiểu String.
This slide should take about 10 minutes.
String::newtrả về một chuỗi rỗng. Khi dữ liệu cần đẩy vào chuỗi đã được xác định trước, hãy sử dụngString::with_capacity.String::lentrả về kích thước củaStringtheo byte (có thể khác với số ký tự trong chuỗi).String::charstrả về một con trỏ chạy dọc theo các ký tự của chuỗi. Lưu ý rằng mộtcharcó thể khác với một “ký tự” thông thường bởi vì một khái niệm gọi là grapheme clusters.- Khi nói đến chuỗi, ta có thể sử dụng
&strhoặcStringđều được. - Khi một kiểu dữ liệu implement
Deref<Target = T>, trình biên dịch sẽ cho phép gọi các hàm thuộc vềTtrên kiểu dữ liệu đó.- Chúng ta chưa đi sâu vào
Dereftrait, việc đề cập đếnDerefở đây chủ yếu là để giải thích cấu trúc của mục lục tài liệu. StringimplementDeref<Target = str>, nên các hàm củastrđều có thể được gọi trên các biến kiểuString.- So sánh
let s3 = s1.deref();vàlet s3 = &*s1;. Cái nào dễ hiểu hơn?
- Chúng ta chưa đi sâu vào
Stringđược được viết dựa trên một vector gồm nhiều byte, nên những hàm gọi được trên vector cũng có thể được gọi trênString, nhưng đi kèm với một số điều kiện để đảm bảo các tính chất của chuỗi.- So sánh các cách truy cập phần tử trong một biến kiểu
String:- Truy cập một ký tự bằng cách sử dụng
s3.chars().nth(i).unwrap()vớiinằm trong phạm vi của chuỗi, và vớiinằm ngoài phạm vi của chuỗi. - Truy cập một xâu con bằng cách sử dụng
s3[0..4], với phạm vi của xâu con con giao thoa với ranh giới của các ký tự cận biên, hoặc với các ký tự cận biên hoàn toàn nằm bên trong xâu con. Ví dụ, truy cậps[5..7] vớis = “Xin chào”`.
- Truy cập một ký tự bằng cách sử dụng
- Nhiều kiểu dữ liệu có thể được chuyển đổi thành chuỗi bằng phương thức
to_string. Trait này đã được implement sẵn cho tất cả các kiểu dữ liệu implementDisplay, nên bất cứ giá trị nào có thể được định dạng cũng có thể được chuyển thành chuỗi.