为什么 Into<String> 可以接受 String 类型?

m-b*_*bat 5 rust

struct Person {
    name: String,
}

impl Person {
    fn new<S: Into<String>>(name: S) -> Person {
        Person { name: name.into() }
    }
}

fn main() {
    let person = Person::new("test");
    let person = Person::new("test".to_string());
}
Run Code Online (Sandbox Code Playgroud)

&strInto<String>特质,所以我知道我可以Person::new("test")正确调用。

但是,我认为Person::new("test".to_string())失败是因为String没有From<String> for String,所以Into<String>不会自动导出。
为什么我可以打电话Person::new("test".to_string())

另外,我也可以调用以下代码。

let test: String = String::from("test".to_string());
Run Code Online (Sandbox Code Playgroud)

在上述情况下,我无法理解String::from("test".to_string())即使String没有也可以成功调用From<String> for String

Ibr*_*med 6

但是,我认为Person::new("test".to_string())失败是因为String没有自动派生From<String> forString Into` 。, so

实际上,From(因此Into)是自反的:

// https://doc.rust-lang.org/src/core/convert/mod.rs.html#545-549

impl<T> From<T> for T {
    fn from(t: T) -> T {
        t
    }
}
Run Code Online (Sandbox Code Playgroud)