创建String
//创建空字符串
let mut s = String::new();
//根据字符串字面值创建字符串 to_string();
let data = "initial contents"';
let s = data.to_string();
let s1 = "initial contents".to_string();
//使用String::from("initial contents");
let s = String::from("initial contents");
更新String
- put_str()方法:把一个字符串切片附加到String
- push()方法:把单个字符附加到String
- +:连接字符串
使用了类似这个签名的方法fn add(self, sL &str) -> String{…} - format!:连接多个字符串
//push_str()
let mut s = String::from("foo");
s.push_str("bar");
println!("{}", s);
//push()
s.push('l');
// +
let s1 = String::from("Hello, ");
let s2 = String::from("World!");
let s3 = s1 + &s2;
println!("{}", s3);
let s3 = format!("{}{}", s1, s2);
Rust不允许对String按索引的形式进行访问
内部表示:Vec:u8
Rust有三种看待字符串的方式:
- 字节
- 标量值
- 字形簇(最接近所谓的“字母”, 相对复杂标准库未提供)
let s = "नमस्ते";
for c in s.chars(){ //通过标量值遍历
println!("{}", c);
}
/*
न
म
स
्
त
े
*/
for c in s.bytes(){ // 通过字节遍历
println!("{}", c);
}
/*
224
164
// --snip--
165
135
*/
Rust不允许对String进行索引的最后一个原因
索引操作应消耗一个常量时间(O(1)),而String无法保证:需要遍历所有内容,来确定有多少个合法字符。
切割String
fn main(){
let hello = "Здравствуйте";
let s = &hello[0..4];
println!("{}", s);
}
可以使用[]和一个范围来创建字符串切片
- 必须谨慎使用
- 如果切割是跨越了字符边界,程序就好panic。