Rust 2.11 字符串
11 Jan 2015 by LelouchHe
字符串对任何程序员都是很重要的概念.由于着眼于系统编程,Rust对于字符串的处理有些不同.可变大小的数据结构都是比较难于管理的,而字符串结构正是可变的.同样,Rust的字符串,也不同于其他系统编程语言,比如C.
看下细节.一个字符串(string)是一串UTF-8编码的Unicode值.所有的字符串都保证是UTF-8编码的.另外,字符串不是以’\0’结尾的,并且可以在字符串中间存在’\0’.
Rust中有2种字符串类型: &str
和String
.
第一个类型是&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
引用是非常简单的,但&str
到String
则涉及内存的使用.除非必要,最好不要那样做.
这就是Rust中字符串的基础了!对于习惯脚本编程的你来说,也许这个比较复杂,但当底层细节很关键的时候,这些的区别是很重要的.记住,String
分配内存能操作自己的数据,而&str
仅仅是其他字符串的引用,这些就够了.