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

为何使用self时会消耗结构体,而解构时不会?

问题解答

首先明确核心逻辑:Rust里的“消耗”本质是所有权的转移,解构行为是否会消耗原变量,取决于结构体字段是否实现了Copy trait。

为什么#a处解构没消耗pt

你的Point结构体字段是f32类型,而f32属于Rust内置的基础类型,已经实现了Copy trait。当执行let Point{x, y} = pt;时,Rust会直接把pt里的x和y字段复制出来,并不会转移整个pt的所有权。所以原变量pt的所有权还在当前作用域,后续依然能被使用(比如赋值给pt2)。

如果把字段换成未实现Copy的类型(比如String),那解构时就会直接消耗原变量,后续再访问pt就会触发编译错误。

为什么#c处调用destroy会消耗pt2

destroy函数的参数是self(而非&self或&mut self),这意味着调用该函数时,必须把pt2的所有权完整转移给函数。所有权转移完成后,原变量pt2就失去了对该值的访问权限,也就是被“消耗”了——这是Rust所有权规则的直接体现:一个值的所有权同一时刻只能属于一个变量。

补充#b处的逻辑

正因为#a处解构没有消耗pt,pt的所有权仍在当前作用域,所以执行let pt2 = pt;时,会触发move语义,把pt的所有权转移给pt2,此时pt就无法再被使用了。

内容的提问来源于stack exchange,提问作者hunex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 13:35:16