Trong phần này chúng ta sẽ tìm hiểu về một kiểu dữ liệu đặc biệt là kiểu String
– chuỗi kí tự.
String
trong Rust hơi khác so với trong các ngôn ngữ khác, các chuỗi trong Rust được mã hóa bằng định dạng UTF-8, các kí tự có thể có kiểu null, tuy nhiên bản thân chuỗi trong Rust không được kết thúc bằng kí tự null như trong C. Trong Rust có 2 loại chuỗi kí tự:
- Chuỗi tĩnh: tức là các chuỗi có độ dài cố định, và các kí tự trong chuỗi không thể thay đổi. Kiểu dữ liệu của chuỗi này trong Rust là
&str
. Kí tự&
cho biết biến thuộc kiểu này là biến tham chiếu (chúng ta sẽ tìm hiểu sau). Ví dụ:
fn main() {
let blog = "Pho Code";
let url: &str = "phocode.com";
}
Lưu ý là các chuỗi này là không thể thay đổi được, nếu bạn viết các câu lệnh như:
fn main() {
let mut url = "phocode.com";
url = "phocode.net";
}
Thì ở đây chúng ta đã cho biến url
tham chiếu tới một chuỗi khác có giá trị là “phocode.net”, còn bản thân chuỗi “phocode.com” vẫn tồn tại, nhưng không được biến url
tham chiếu tới nữa mà thôi.
- Chuỗi động: tức là các chuỗi có thể thay đổi các kí tự và do đó có thể thay đổi độ dài của nó. Trong Rust thì kiểu dữ liệu của chuỗi này là
String
. Chúng ta có thể khởi tạo chuỗiString
rỗng cũng được. Ví dụ:
fn main() {
let url = String::new();
}
Khi một biến String
được tạo ra thì biến này sẽ được hệ điều hành cấp bộ nhớ trong máy tính, mỗi khi chúng ta muốn thay đổi độ dài của chuỗi trong String
thì chúng ta phải xin cấp lại lượng bộ nhớ mới. Chẳng hạn như chúng ta muốn lưu trữ 10 kí tự thì chúng ta phải xin hệ điều hành cấp 10 byte, để xin cấp bộ nhớ thì chúng ta gọi hàm with_capacity()
và truyền vào hàm số byte như sau:
fn main() {
let url = String::with_capacity(10);
}
Chuyển kiểu String thành &str
Chúng ta cũng có thể chuyển một biến thuộc kiểu String
thành kiểu &str
bằng hàm to_string()
trong lớp String
như sau:
fn main() {
let url = String::with_capacity(10);
let urlStr = url.to_string();
}
Ngoài hàm to_string()
chúng ta cũng có thể sử dụng kí tự &
như sau:
fn main() {
let mut url = String::new();
let urlStr = &url;
}
Sự khác nhau của kí tự &
và hàm to_string()
là kí tự &
không tạo ra một chuỗi kí tự mới mà chỉ tham chiếu đến chuỗi kí tự gốc mà thôi, nhưng khi sử dụng thì biến tham chiếu kiểu này vẫn được coi là kiểu &str
chứ không phải String
, do đó kí tự &
tiết kiệm bộ nhớ hơn so với hàm to_string()
.
Đưa giá trị vào chuỗi
Để đưa các kí tự vào String
thì chúng ta có thể sử dụng hàm push()
hoặc push_str()
của String
như sau:
fn main() {
let mut url = String::new();
url.push(‘p’);
url.push_str("hocode.com");
println!("{}", url);
}
Đối với push()
thì chúng ta chỉ đưa vào từng kí tự thôi, còn push_str()
thì có thể đưa nhiều kí tự hơn.
phocode.com
Lấy độ dài chuỗi
Chúng ta có thể dùng hàm len()
trong String
để lấy độ dài của một chuỗi, ví dụ:
fn main() {
let mut url = String::new();
url.push_str("https://phocode.com");
println!("URL Length: {}", url.len());
}
URL Length: 18
Tách từng kí tự
Chúng ta có thể lấy danh sách các kí tự của String
thông qua hàm chars()
, thực chất hàm này trả về một kiểu dữ liệu là Iterator
(chúng ta sẽ tìm hiểu sau) và chúng ta có thể dùng vòng lặp for
để lặp qua các kí tự của kiểu này, ví dụ:
fn main() {
let mut url = String::new();
url.push(‘p’);
url.push_str("hocode.com");
for character in url.chars() {
println!("{}", character);
}
}
Đoạn code trên sẽ cho ra kết quả như sau:
p h o c o d e . c o m
Tách chuỗi
Chúng ta cũng có thể tách một chuỗi thành các chuỗi nhỏ hơn bằng hàm split()
, hàm này nhận vào kí tự phân tách và cũng trả về một biến Iterator
, ví dụ:
fn main() {
let mut str = String::new();
str.push_str("Lorem ipsum dolor sit amet, sententiae suscipiantur mel an");
for sentence in str.split(" ") {
println!("{}", sentence);
}
}
Trong đoạn code trên, chúng ta gọi hàm split()
và truyền vào chuỗi có 1 dấu cách, tức là chúng ta muốn tách chuỗi str
thành các chuỗi nhỏ hơn thông qua dấu cách.
Lorem ipsum dolor sit amet, sententiae suscipiantur mel an
Thay thế chuỗi
Trong String
có hàm replace()
dùng để thay thế một chuỗi con thành một chuỗi khác.
fn main() {
let mut url = String::new();
url.push_str("Rust Programming");
println!("{}", url);
let url2 = url.replace("Programming", "Language");
println!("{}", url2);
}
Hàm replace()
nhận vào 2 tham số, tham số đầu tiên là chuỗi cần tìm, tham số thứ 2 là chuỗi sẽ được thay thế. Trong đoạn code trên chúng ta thay thế tất cả chuỗi con ".com"
thành ".net".
Hàm này sẽ trả về một chuỗi mới chứ không thực hiện thay đổi các kí tự trong chuỗi gốc.
Rust Programming Rust Language
Tham số hàm
Khi chúng ta viết hàm mà có nhận vào tham số là chuỗi thì chúng ta nên dùng kiểu &str
thay cho String
, lý do là vì dùng String
sẽ tốn nhiều bộ nhớ hơn so với dùng &str
vì &str
chỉ là kiểu tham chiếu lại, không phải tạo mới chuỗi.
fn main() {
let mut url = String::new();
url.push_str("Lorem ipsum dolor sit amet, sententiae suscipiantur mel an");
getStringLength( &url );
}
fn getStringLength(str: &str) {
println!("String Length: {}", str.len());
}
String Length: 58