2016-12-17 34 views
2

考慮的例子(不建):爲什麼`name = * name.trim();`給我`預期的結構`std :: string :: String`,找到str`?

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` 

回答

6

讓我們看看method signature of str::trim()

fn trim(&self) -> &str 

它返回一個&str而不是String!爲什麼?因爲它不需要!修剪是一種不需要分配新緩衝區的操作,因此不會產生擁有的字符串。 A &str只是一個指針和一個長度......通過增加指針和減少長度,我們可以在字符串切片中添加另一個視圖。這就是修剪所做的一切。

因此,如果您真的想將修剪後的字符串轉換爲擁有的字符串,例如name.trim().to_owned()

+1

值得注意的是'trim'不是一個'String'方法,它實際上是一個'''通過'Deref'特徵的奇蹟繼承的'str'方法。 – user4815162342

相關問題