Rust中String和str有什么区别?何时使用?
大家好!我开始学习Rust,遇到了一个非常令人困惑的话题——字符串。在文档中经常看到`String`和`&str`,但我完全搞不清它们之间的区别以及何时使用哪种类型。
我写了一个小例子:
```rust
fn main() {
let s1 = "hello"; // 这是str吗?
let s2 = String::from("hello"); // 这是String吗?
println!("{}", s1);
println!("{}", s2);
// 为什么这个能工作?
let s3: &str = &s2;
println!("{}", s3);
// 而这个不行?
// let s4: String = s1; // 错误!
}
```
我看到`s1`是一个字符串字面量,而`s2`是通过`String::from()`创建的。但是当我尝试将`s1`赋值给`String`类型的变量时,编译器报错。然而,我可以获取`s2`的引用并将其赋值给`&str`。
有人能用简单的话解释一下:
1. 什么是`String`,什么是`str`?
2. 为什么`str`总是带有一个与符号(`&str`)?
3. 在什么情况下应该使用`String`,什么情况下使用`&str`?