`&self.stringVal` 和 `self.stringVal.as_str()` 之间的区别

way*_*yne 4 rust

谁能告诉我返回of&str值的两种方法有什么区别?两者都可以编译,但我不确定是否有首选。nameUser


pub struct User {
    name: String,
}

impl User {

    pub fn name(&self) -> &str {
        // way1
        &self.name

        // way2
        // self.name.as_str()
    }

}


Run Code Online (Sandbox Code Playgroud)

hkB*_*Bst 5

使用&aString给出 a&String并依赖 deref 强制转换来达到所需的&str类型,但as_str明确给出 a &str(同时在内部使用 deref 强制转换)。如果没有 deref 强制,则必须编写才能&s[..]将 a 转换String s为 a &str

\n
\n

Deref 强制将对实现该特征的类型的引用转换Deref为对另一种类型的引用。例如, deref\ncoercion 可以转换&String&str因为String实现了该Deref特征,使其返回&str。Deref 强制是 Rust 对函数和方法的参数执行的一种便利,并且仅适用于实现该Deref特征的类型。当我们将对特定类型值的引用作为参数传递给与函数或方法定义中的参数类型不匹配的函数或方法时,就会自动发生这种情况。对方法的一系列调用deref会将我们提供的类型转换为参数所需的类型。-- Rust 编程语言(第 15 章)

\n
\n

一些程序员可能因为其中的简洁而喜欢其中一种,而另一些程序员可能因为其清晰而喜欢另一种。

\n