String 字符串

Rust 中的字符串

Rust的核心语言层面,只有一个字符串类型:字符串切片str 或&str。

字符串切片 : 对存储在其它地方、UTF-8编码的字符串的引用。

Rust 的标准库还包含了很多其它的字符串类型,例如:OsString、OsStr、CString。

String vs Str后缀 : 拥有或借用的变体。

创建字符串

to_string()

fn main() {
    let s: String = "hello".to_string();
    println!("{}",s);
}

String::from()

fn main() {
    let s: String = String::from("hello world");
    println!("{}",s);
}

字符串拼接 push_str()

fn main() {
    let mut s: String = String::from("hello world");
    s.push_str(" ...!");
    println!("{}",s);
}

push_str() 不会获得变量的所有权。

单个字符添加 push()

注意单引号!!

fn main() {
    let mut s: String = String::from("hello world");
    s.push_str(" ...");
    s.push('!');
    println!("{}",s);
}

使用加号拼接

+ 是把第一个字符串和第2个字符串的引用进行相加。

fn main() {
    let s: String = String::from("hello world");
    let s2 = s + &"..!".to_string();
    println!("{}", s2);
    // s1 变量在拼接后已经销毁
    //错误用法 : println!("{}", s);
}

使用 format 进行拼接

fn main() {
    let s: String = String::from("hello world");
    let s2 = format!("{}-{}", s, "!");
    println!("{}", s2);
    println!("{}", s);
}

索引访问

Rust 不允许对 String 进行索引的最后一个原因:

索引操作应消耗一个常量时间(O(1));

而String无法保证:需要遍历所有内容,来确定有多少个合法的字符;

字符串截取

可以使用[]和一个范围来创建字符串的切片(例子)

谨慎使用,如果切割时跨越了字符边界,程序就会panic。

fn main() {
    let s: String = String::from("hello world");
    let s2: String = s[0..2].to_string();
    println!("s2: {}", s2);
    println!("s: {}", s);
}

获取长度

fn main() {
    let s: String = String::from("hello 你好");
    let len: usize = s.len();
    println!("The length of '{}' is {}.", s, len);
}