Rust中解构enum为何得到引用而非值?
为什么Rust枚举解构得到的是引用而非值?
原因很简单:你当前匹配的self是引用类型(比如&Frame或&mut Frame),而非Frame本身。
在Rust的模式匹配中,当匹配目标是引用时,模式会自动对枚举变体做「引用解构」——也就是说,原本枚举里的u8字段,会被解构为对应的引用类型&u8。比如如果你的方法签名是fn process(&self) { ... },这里的self就是&Frame,匹配时自然会得到引用类型的字段。
解决办法
有两种常见方式可以得到u8类型的字段值:
解引用整个匹配目标:
将match self改为match *self,这样匹配的是Frame值本身,解构出来的v和c就是u8类型:match *self { Self::RSTACK{v, c} => { /* v: u8, c: u8 */ } }注意:这种方式要求
Frame实现了Copytrait(因为u8是Copy的,所以如果枚举其他变体也都是Copy类型,整个枚举可以自动推导为Copy),或者你拥有self的所有权(比如self是mut self且你可以移动它)。手动解引用字段:
保留match self,在代码中手动对引用字段解引用:match self { Self::RSTACK{v, c} => { let v: u8 = *v; let c: u8 = *c; // 后续使用v和c的u8值 } }这种方式更灵活,不需要考虑整个枚举的Copy或所有权问题,适合只需要个别字段值的场景。
内容的提问来源于stack exchange,提问作者akauppi
相关产品推荐
相关产品推荐

