Rust – String


Được đăng vào ngày 07/10/2017 | 0 bình luận
Rust – String
Đánh giá bài viết

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ỗi String 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
Được đăng vào ngày 07/10/2017