Home

Rust 2.11 字符串

11 Jan 2015 by LelouchHe

原文链接

字符串对任何程序员都是很重要的概念.由于着眼于系统编程,Rust对于字符串的处理有些不同.可变大小的数据结构都是比较难于管理的,而字符串结构正是可变的.同样,Rust的字符串,也不同于其他系统编程语言,比如C.

看下细节.一个字符串(string)是一串UTF-8编码的Unicode值.所有的字符串都保证是UTF-8编码的.另外,字符串不是以’\0’结尾的,并且可以在字符串中间存在’\0’.

Rust中有2种字符串类型: &strString.

第一个类型是&str,称为字符串片(string slice).字符串字面量就是这个类型:

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

这种字符串的空间是静态分配的,即它是保存在已经编译好的程序内部的,并且存在于整个程序生命期内.string是该静态字符串的一个绑定.字符串片长度固定,且不能修改.

String类型则相反,它是保存在内存中的.这种字符串可以增长,而且同样是UTF-8编码的.

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

s.push_str(", world.");
println!("{}", s);

你可以通过as_slice()得到String对象的一个&str引用:

fn takes_slice(slice: &str) {
    println!("Got: {}", slice);
}

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

比较两种类型字符串的话,尽量使用as_slice():

fn compare(string: String) {
    if string.as_slice() == "Hello" {
        println!("yes");
    }
}

而不是to_string():

fn compare(string: String) {
    if string == "Hello".to_string() {
        println!("yes");
    }
}

String对象的&str引用是非常简单的,但&strString则涉及内存的使用.除非必要,最好不要那样做.

这就是Rust中字符串的基础了!对于习惯脚本编程的你来说,也许这个比较复杂,但当底层细节很关键的时候,这些的区别是很重要的.记住,String分配内存能操作自己的数据,而&str仅仅是其他字符串的引用,这些就够了.