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



我正在rustlings中进行traits2.rs练习,对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。为什么允许这样做?

相关函数的参考说明:

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

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

FunctionParam:OuterAttribute*模式:类型

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

标识符模式:ref?mut?标识符(@图案(?

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

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

调用方不需要知道它:您可以以某种方式移动值,因此是否需要对其进行变异取决于被调用方。

最新更新