如何简化Rust中XYBin转Bin的Into trait实现代码?
简化Rust中XYBin到Bin的Into实现代码
当然可以,利用Rust的结构体解构和字段初始化简写就能大幅减少重复代码,完全不需要宏。
优化后的代码
首先注意你原代码里packets_rx: self.packets_tx看起来像是笔误(用发送字段赋值接收字段),如果这是故意的逻辑,以下是优化版本:
impl Into<Bin> for XYBin { fn into(self) -> Bin { // 解构XYBin实例,提取需要的字段,对特殊赋值的字段重命名 let XYBin { packets_tx, octets_tx, packets_tx: packets_rx, // 对应原代码的特殊赋值逻辑 octets_rx, packets_rx_on_only, octets_rx_on_only, packets_rx_on, octets_rx_on, .. // 忽略XYBin中Bin不需要的其他字段(因为XYBin是超集) } = self; // 用字段初始化简写创建Bin实例,无需重复写字段名和赋值源 Bin { packets_tx, octets_tx, packets_rx, octets_rx, packets_rx_on_only, octets_rx_on_only, packets_rx_on, octets_rx_on, } } }
如果packets_rx: self.packets_tx是笔误,原本应该是packets_rx: self.packets_rx,那代码可以更简洁:
impl Into<Bin> for XYBin { fn into(self) -> Bin { let XYBin { packets_tx, octets_tx, packets_rx, octets_rx, packets_rx_on_only, octets_rx_on_only, packets_rx_on, octets_rx_on, .. } = self; Bin { packets_tx, octets_tx, packets_rx, octets_rx, packets_rx_on_only, octets_rx_on_only, packets_rx_on, octets_rx_on, } } }
原理说明
- 结构体解构:通过
let XYBin { .. } = self把self的字段直接提取到当前作用域,避免重复写self.xxx。 - 字段初始化简写:当结构体字段名和当前作用域中的变量名完全一致时,可以只写字段名,Rust会自动完成赋值,省去
字段名: 变量名的重复写法。 - 忽略多余字段:用
..忽略XYBin中Bin不需要的字段,这样后续XYBin新增字段时,这段转换代码无需修改,兼容性更好。
内容的提问来源于stack exchange,提问作者fadedbee
相关产品推荐
相关产品推荐

