我正在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
调用者不需要知道这一点:您以一种或另一种方式移动该值,因此是否需要改变它取决于被调用者。