You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何不可变 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 20:12:02