Rust迭代器map回调参数错误:期望1个参数却传入3个
Rust迭代器map方法适配多参数函数解决方案
map 方法要求传入的闭包/函数只能接收迭代器产出的单个元素作为参数,直接传递需要3个参数的do_work自然会因为参数数量不匹配报错。下面是两种实用的解决方式:
方式一:闭包捕获外部变量
这是最常用的方案,利用闭包捕获i2和i3,将迭代元素作为第一个参数传入do_work:
fn do_work(a: i32, b: i32, c: i32) -> i32 { a + b + c } fn main() { let i2 = 2; let i3 = 3; let nums = vec![1, 2, 3]; // 正确写法:闭包接收迭代元素,带上捕获的i2、i3调用do_work let result = nums.iter().map(|&i1| do_work(i1, i2, i3)).collect::<Vec<_>>(); println!("{:?}", result); // 输出 [6,7,8] }
注:如果用into_iter()代替iter(),可以不用解引用&i1,直接用|i1|即可。
方式二:包装成单参数函数
如果i2和i3是固定值,也可以手动包装一个单参数函数,绑定好后传给map:
fn do_work(a: i32, b: i32, c: i32) -> i32 { a + b + c } // 包装函数:固定i2和i3,只接收第一个参数 fn do_work_with_fixed_params(a: i32) -> i32 { do_work(a, 2, 3) } fn main() { let nums = vec![1, 2, 3]; // 配合into_iter()直接传递包装后的函数 let result = nums.into_iter().map(do_work_with_fixed_params).collect::<Vec<_>>(); println!("{:?}", result); // 输出 [6,7,8] }
内容的提问来源于stack exchange,提问作者Salman Amin
相关产品推荐
相关产品推荐

