Rust图边泛型结构体构造函数含if判断返回结构错误问题
错误原因分析
该错误不存在Rust的特殊行为,完全是代码逻辑书写错误导致的,具体问题有两点:
- 误解了Rust命名字段结构体的初始化规则:Rust中带命名字段的结构体初始化时,字段的书写顺序不影响赋值结果,系统只会按字段名匹配对应值。你在if分支调换
second、first的书写顺序,本质还是给结构体first字段赋值入参的first、second字段赋值入参的second,两个分支的返回结果完全一致,根本没有实现交换字段的效果。 - 大小判断逻辑不符合需求:你的目标是让结构体
first字段存储更小的索引,当前代码的判断条件if second > first逻辑写反,即便赋值逻辑正确也无法得到预期结果。
修复方案
可以先对两个入参索引做排序再赋值给结构体字段,示例代码如下:
impl<T> Edge<T> { pub fn new(first: Index, second: Index, weight: T) -> Self { Edge { first: first.min(second), second: first.max(second), weight } } }
或者用条件表达式显式交换的写法:
impl<T> Edge<T> { pub fn new(first: Index, second: Index, weight: T) -> Self { let (first, second) = if first > second { (second, first) } else { (first, second) }; Self { first, second, weight } } }
内容的提问来源于stack exchange,提问作者Tomasz Bawor
相关产品推荐
相关产品推荐

