如何在Rust中就地将Vec<f32>的0值替换为NaN?
就地修改Vec,将0值替换为NaN的正确实现
你遇到的编译错误是因为for_each方法要求闭包返回单元类型()(即无返回值),但你的闭包返回了f32类型的值(f32::NAN或*v),导致类型不匹配。
要实现就地修改,你需要直接对迭代器提供的可变引用进行赋值操作,而非返回值。以下是两种正确写法:
写法1:条件判断后赋值
let mut vector: Vec<f32> = vec![2.0, 0.0, 1.0, 3.0, -1.0, 5.0]; vector.iter_mut().for_each(|v| { if *v == 0.0 { *v = f32::NAN; } }); println!("{vector:?}");
这种写法仅在值为0时执行修改,其余值保持原样,逻辑清晰直观。
写法2:条件表达式赋值(更简洁)
let mut vector: Vec<f32> = vec![2.0, 0.0, 1.0, 3.0, -1.0, 5.0]; vector.iter_mut().for_each(|v| *v = if *v == 0.0 { f32::NAN } else { *v }); println!("{vector:?}");
通过条件表达式直接生成目标值,再赋值给*v,整个赋值操作的返回值为(),完全符合for_each的要求。
运行后输出结果:
[2.0, NaN, 1.0, 3.0, -1.0, 5.0]
内容的提问来源于stack exchange,提问作者weiji14
相关产品推荐
相关产品推荐

