考虑一下这个例子(不构建):
use std::io::{self, Write};
fn main() {
io::stdout().write(b"Please enter your name: ");
io::stdout().flush();
let mut name = String::new();
io::stdin().read_line(&mut name);
name = *name.trim();
println!("Hello, {}!", name);
}
为什么会出现以下错误?
error[E0308]: mismatched types
--> src/main.rs:8:12
|
8 | name = *name.trim();
| ^^^^^^^^^^^^ expected struct `std::string::String`, found str
|
= note: expected type `std::string::String`
= note: found type `str`
答案 0 :(得分:6)
让我们看一下method signature of str::trim()
:
fn trim(&self) -> &str
它会返回&str
而不是String
!为什么?因为它不需要!修剪是一种不需要分配新缓冲区的操作,因此不会产生拥有的字符串。 &str
只是一个指针和一个长度...通过递增指针并减少长度,我们可以在字符串切片中有另一个视图。这就是修剪所做的一切。
因此,如果您真的想将修剪过的字符串转换为拥有的字符串,请说name.trim().to_owned()
。