首页 > 解决方案 > 为什么当 Trait 定义只使用 self 时,在 Trait 实现中允许 mut self?

问题描述

我正在做traits2.rsrustlings 的练习,对 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
    }
}

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

标签: rusttraits

解决方案


相关功能的参考说:

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

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

FunctionParam:OuterAttribute* Pattern:类型

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

标识符模式:参考?哑巴?标识符(@模式)?

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

这里需要注意的是mut selfvsself&selfvs不同&mut self。与其他参数一样,mutinmut self只是对 的绑定的注解self,而不是类型。

调用者不需要知道它:你以一种或另一种方式移动值,所以它是否需要改变它取决于被调用者。


推荐阅读