W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
對于任何程序員來說,字符串是一個(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’。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: