为何不可变 trait 的实现中可对自身进行修改?
问题解答
先贴上你的可编译代码:
trait AppendBar { fn append_bar(self) -> Self; } impl AppendBar for Vec<String> { fn append_bar(mut self) -> Self { self.push("Bar".to_string()); self } }
这里的核心是所有权和可变性是Rust里两个独立的概念:
- 拿到
self的所有权,意味着你完全拥有这个Vec<String>实例,有权对它做任何处置(包括修改、转移所有权、销毁) - 但默认情况下,所有权绑定的变量是不可变的,你没法直接调用
push这类需要可变操作的方法。加上mut关键字,是把这个所有权绑定的变量标记为可变绑定,允许你修改它的内部状态。
简单来说:你拿到了东西的所有权,不代表你能直接改它,还得明确告诉编译器“我要改这个东西”——mut self就是干这个的。改完之后,你再把这个修改后的实例(带着所有权)返回出去就行。
内容的提问来源于stack exchange,提问作者dpr
相关产品推荐
相关产品推荐

