字符串

2018-08-12 22:03 更新

字符串

對于任何程序員來說,字符串是一個(gè)重要的且必須掌握的概念。由于其系統(tǒng)專注的點(diǎn)不同,Rust 的字符串處理系統(tǒng)有點(diǎn)不同于其他計(jì)算機(jī)語言,。無論何時(shí),當(dāng)你有一個(gè)可變大小的數(shù)據(jù)結(jié)構(gòu),事情可能會(huì)變得棘手,還有,字符串是一種能重設(shè)大小的數(shù)據(jù)結(jié)構(gòu)。也就是說,Rust 的字符串的工作方式也不同于其他的系統(tǒng)語言,如 C 語言。

讓我們深入細(xì)節(jié)?!白址笔?Unicode 標(biāo)量值的序列編碼為 utf - 8 字節(jié)的流。所有字符串都必須保證為有效的 utf-8 編碼序列。此外,不像一些系統(tǒng)語言,這里的字符串是非空終止字符串,并且,可以包含空字節(jié)。

Rust 有兩個(gè)主要類型的字符串: str 和字符串。首先讓我們來談?wù)?str。它一般被稱為“串片”。字符串一般都是&'static str 類型的:

let string = "Hello there."; // string: &'static str

這個(gè)字符串是靜態(tài)分配的,這意味著它保存在我們的編譯程序里面,并且存在于程序運(yùn)行的整個(gè)時(shí)間。字符串通過綁定來引用這個(gè)靜態(tài)分配的字符串。字符串片有固定大小,不能突變。

一個(gè)字符串,另一方面來說,是一個(gè)基于堆的字符串。這個(gè)字符串是可生長的,并且保證為 utf-8。通常使用 to_string 方法將一個(gè)字符串轉(zhuǎn)換為另一個(gè)字符串。

let mut s = "Hello".to_string(); // mut s: String
println!("{}", s);

s.push_str(", world.");
println!("{}", s);
通過&將字符串放入&str :
fn takes_slice(slice: &str) {
println!("Got: {}", slice);
}

fn main() {
let s = "Hello".to_string();
takes_slice(&s);
}

將一個(gè)字符串轉(zhuǎn)換為 &str 很容易,但將 &str 轉(zhuǎn)換為一個(gè)字符串包含分配內(nèi)存的操作。除非有必要,否則不要這樣做!

索引

因?yàn)樽址际怯行У?UTF-8,字符串不支持索引

let s = "hello";

println!("The first letter of s is {}", s[0]); // ERROR!!!

通常。用 [] 訪問向量是非常方便的。但是,因?yàn)?utf-8編碼的字符串里面的每個(gè)字符可以多個(gè)字節(jié),你必須檢索字符串才可以找到字符串的第 n 個(gè)字母。這是一個(gè)太過復(fù)雜的操作,我們不想被誤導(dǎo)。此外,“字母”不是 Unicode 中定義的東西,沒錯(cuò)。我們可以把字符串看做一個(gè)單獨(dú)的字節(jié),或 codepoints:

let hachiko = "忠犬ハチ公";

for b in hachiko.as_bytes() {
print!("{}, ", b);
}

println!("");

for c in hachiko.chars() {
print!("{}, ", c);
}

println!("");

這將輸出:

229,191,160,229,191,172,227,131,143,227,131,129,229,133,172,

忠犬,ハ,チ、公

如您所見,這的字節(jié)比字符更多。

你可以得到類似于這樣的一個(gè)索引:

let dog = hachiko.chars().nth(1); // kinda like hachiko[1]

這強(qiáng)調(diào),我們必須跨越整個(gè)字符列表。

連接

如果你有一個(gè)字符串,可以在它的結(jié)尾連接一個(gè) str 作為結(jié)束:

let hello = "Hello ".to_string();
let world = "world!";

let hello_world = hello + world;

但是如果你有兩個(gè)字符串,您需要一個(gè) &:

let hello = "Hello ".to_string();
let world = "world!".to_string();

let hello_world = hello + &world;

這是因?yàn)?&String 可以自動(dòng)連接一個(gè) str。這個(gè)特點(diǎn)也叫作叫做 ‘Deref coercions’。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號