Rust
Rust 的核心语言中只有一种字符串类型:str,字符串 slice,它通常以被借用的形式出现,&str。 字符串 slice:他们是一些储存在别处的 UTF-8 编码字符串数据的引用。
称作 String 的类型是由标准库提供的,而没有写进核心语言部分,它是可增长的、可变的、有所有权的、UTF-8 编码的字符串类型。当 Rust开发者 们谈到 Rust 的 “字符串”时,他们通常指的是 String 和字符串 slice &str类型,而不是其中一个。这一部分大部分是关于 String 的,不过这些类型在 Rust 标准库中都被广泛使用。String 和字符串 slice 都是 UTF-8 编码的。
赋值
在《Rust程序设计语言》中变量与数据的交互的方式(一):移动使用了如下实例,
fn main() {
println!("Hello, world!");
let s1 = String::from("hello");
let s2 = s1;
println!("{}",s2);
// println!("{}",s1);
// let s3 = s2.clone();
// println!("{}{}",s3,s2);
}
强调了Rust语言的特异点
1. Rust认为s1不再有效,故执行s2=s1之后尝试获取s1的值会报错
error[E0382]: use of moved value: `s1`
--> src/main.rs:6:19
|
4 | let s2 = s1;
| -- value moved here
5 | println!("{}",s2);
6 | println!("{}",s1);
| ^^ value used here after move
|
= note: move occurs because `s1` has type `std::string::String`, which does not implement the `Copy` trait
这个操作被称为“移动”,而不是浅拷贝。
而对于整型这样的在编译时已知大小的类型被整个存储在栈上,所以旧的整型变量在重新赋值后依然可用。
取子串
let s = String::from("kingeasternsun");
let firstname = &s[0..4];
let secondname = &s[4..];
println!("{}",firstname);
println!("{}",secondname);
使用..进行取子串的操作,需要注意的是由于String的移动特性,所以要在s前加&.
注意前面的警告,原因时我在代码里定义了一个Rectangle的结构体没有使用,Rust中如果定义了一个结构体但是没有使用会报警告,结构体后续会详细介绍。
使用 push 附加字符串
可以通过 push_str 方法来附加字符串 slice,从而使 String 变长:
let mut s = String::from("foo");
s.push_str("bar");
执行这两行代码之后 s 将会包含 “foobar”。push_str 方法获取字符串 slice,因为并不需要获取参数的所有权。例如,如果将 s2 的内容附加到 s1 中后自身不能被使用就糟糕了:
let mut s1 = String::from("foo");
let s2 = String::from("bar");
s1.push_str(&s2);
push 方法被定义为获取一个单独的字符作为参数,并附加到 String 中:
let mut s = String::from("lo");
s.push('l');
执行这些代码之后,s 将会包含 “lol”。
使用 + 运算符或 format! 宏级联字符串
通常我们希望将两个已知的字符串合并在一起。一种办法是像这样使用 + 运算符:
let s1 = String::from("Hello, ");
let s2 = String::from("world!");
let s3 = s1 + &s2; // Note that s1 has been moved here and can no longer be used
执行完这些代码之后字符串 s3 将会包含 Hello, world!。
字符串遍历
如果你需要操作单独的 Unicode 标量值,最好的选择是使用 chars 方法。对 “नमस्ते” 调用 chars 方法会将其分开并返回六个 char 类型的值,接着就可以遍历结果来访问每一个元素了:
for c in "नमस्ते".chars() {
println!("{}", c);
}
这些代码会打印出如下内容:
न
म
स
्
त
े
bytes 方法返回每一个原始字节,这可能会适合你的使用场景:
for b in