我正在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 self
与self
的对比与&self
与&mut self
的对比不同。与其他参数一样,mut self
中的mut
只是对self
绑定的注释,而不是类型。
调用方不需要知道它:您可以以某种方式移动值,因此是否需要对其进行变异取决于被调用方。