rust - 为什么当 Trait 定义只使用 self 时,在 Trait 实现中允许 mut self?
问题描述
我正在做traits2.rs
rustlings 的练习,对 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:类型
在Pattern
这种情况下是标识符模式:
标识符模式:参考?哑巴?标识符(@模式)?
这导致这mut
是模式的一部分,而不是类型的一部分,这就是为什么mut
(不像&mut
)根本不是签名的一部分,所以这就是为什么你被允许使用它的原因。
这里需要注意的是mut self
vsself
与&self
vs不同&mut self
。与其他参数一样,mut
inmut self
只是对 的绑定的注解self
,而不是类型。
调用者不需要知道它:你以一种或另一种方式移动值,所以它是否需要改变它取决于被调用者。
推荐阅读
- python - 使用迭代时在 tkinter textarea 小部件中设置多种字体
- azure - 在 Azure B2C 中对用户进行分组和搜索
- google-sheets - 谷歌表格将小数(0-100)转换为分钟(0-60)
- angular - 通过 Angular 中的兄弟组件发送数据
- oracle - 导出到 11.2 格式时出现“ORA-22814:属性或元素值大于类型中指定的值”错误
- java - 将两个一维字符串数组合并为一个带分隔符的数组
- xml - 使用 xmlstarlet 修复丢失的根节点
- node.js - Gulp:使用“sass”(不是“gulp-sass”)编译 sass 文件
- c# - 如何在字典 TryGetValue 中初始化 int 输出
- javascript - 在 JavaScript 中检查 `null`