当 Trait 定义仅使用 self 时,为什么 Trait 实现中允许使用 mut self?

cic*_*lus 16 traits rust

我正在traits2.rsruslings 中进行练习,并且对 Rust 的特征语法感到困惑。我有以下工作解决方案(编译并通过测试,我使用 Rust 1.50):

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

impl AppendBar for Vec<String> {
    fn append_bar(mut self) -> Self {
        self.push("Bar".into());
        self
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,我感到困惑的是,虽然特征定义是fn append_bar(self) -> Self,但我的实现是,它在签名上fn append_bar(mut self) -> Self有一个附加的。mut为什么这是允许的?

Yan*_*unk 13

相关函数的参考资料说:

标识符是函数的名称。关联函数的泛型、参数列表、返回类型和 where 子句必须与关联函数声明的相同。

匹配参数列表意味着匹配参数的数量和类型。函数参考解释了参数的结构:

函数参数:外部属性* 模式:类型

Pattern在这种情况下是标识符模式

标识符模式:参考?穆特?标识符(@模式)?

这导致mut是模式的一部分,而不是类型的一部分,这就是为什么mut(与&mut)根本不是签名的一部分的原因,所以这就是为什么您被允许使用它。

这里需要注意的是mut selfvs与vsself不同。与其他参数一样,in只是 绑定的注释,而不是类型。&self&mut selfmutmut selfself

调用者不需要知道这一点:您以一种或另一种方式移动该值,因此是否需要改变它取决于被调用者。