为什么`name =*name.trim();`给我`期望的结构`std :: string :: String`,找到str`?

d33*_*tah 3 rust

考虑一下这个例子(不构建):

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);
}
Run Code Online (Sandbox Code Playgroud)

为什么我会收到以下错误?

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`
Run Code Online (Sandbox Code Playgroud)

Luk*_*odt 6

我们来看看方法签名str::trim():

fn trim(&self) -> &str
Run Code Online (Sandbox Code Playgroud)

它返回一个&str而不是一个String!为什么?因为它不需要!修剪是一种不需要分配新缓冲区的操作,因此不会产生拥有的字符串.A &str只是一个指针和一个长度...通过递增指针并减少长度,我们可以在字符串切片中有另一个视图.这就是修剪所做的一切.

因此,如果您真的想将修剪后的字符串转换为拥有的字符串,请说name.trim().to_owned().

  • 值得注意的是`trim`不是`String`方法,它实际上是`String`通过`Deref`特征的奇迹继承的`str`方法. (2认同)