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:

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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.

Speaker Notes

This slide should take about 10 minutes.
  • String::new trả 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ụng String::with_capacity.
  • String::len trả về kích thước của String theo byte (có thể khác với số ký tự trong chuỗi).
  • String::chars trả về một con trỏ chạy dọc theo các ký tự của chuỗi. Lưu ý rằng một char có 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 &str hoặc String đề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ề T trên kiểu dữ liệu đó.
    • Chúng ta chưa đi sâu vào Deref trait, việc đề cập đến Deref ở đây chủ yếu là để giải thích cấu trúc của mục lục tài liệu.
    • String implement Deref<Target = str>, nên các hàm của str đều có thể được gọi trên các biến kiểu String.
    • So sánh let s3 = s1.deref();let s3 = &*s1;. Cái nào dễ hiểu hơn?
  • 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ên String, 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ới i nằm trong phạm vi của chuỗi, và với i nằ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ập s[5..7] với s = “Xin chào”`.
  • 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 implement Display, 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.