为什么不可变特征的实现可以是可变的?

问题描述 投票:0回答:1

这是我的代码,可以编译

trait AppendBar {
    fn append_bar(self) -> Self;
}

impl AppendBar for Vec<String> {
    fn append_bar(mut self) -> Self {
        self.push("Bar".to_string());
        self
    }

虽然它拥有所有权,但为什么它可以在实现中改变自己?

rust traits ownership mutability
1个回答
3
投票

因为参数的可变性不是函数签名的一部分。

这...

fn foo(self) { ... }

...从外面看起来和...完全一样

fn foo(mut self) { ... }

...因为一旦控制转移到函数,参数会发生什么与调用者无关。

因此,特征的实现是允许的,因为从调用者的角度来看,签名实际上是相同的。


换句话说,这两个函数有什么区别?

fn foo(mut v: String) {
    // ...
}

fn foo(v: String) {
    let mut v = v; // Rebind v as mutable.
    // ...
}

答案是没有。

String
值被赋予函数,所以它总是可以改变它。如果它有助于您理解正在发生的事情,您可以将第一个示例视为第二个示例的“快捷方式”,但它们最终意味着相同的事情。


注意这不是 Rust 独有的东西;在 C++ 中,函数参数的

const
-ness 也不是函数签名的一部分。

© www.soinside.com 2019 - 2024. All rights reserved.