如何在Rust不同闭包中重复借用外部变量?附代码报错修正
问题修正方案
你的代码出现编译错误的核心原因是:filter闭包对变量i进行了可变借用(执行i += 1),而后续map闭包又对i进行了不可变借用,违反了Rust的借用规则——同一时间不能共存一个可变借用和任意不可变借用。另外就算绕过借用问题,你也得不到预期结果:map里拿到的i是所有元素遍历后的最终值,而非每个匹配元素对应的序号。
正确的做法是使用Rust迭代器内置的enumerate方法自动维护元素索引,替代手动计数:
contents.lines() .enumerate() .filter(|(_, line)| line.to_lowercase().contains(&query.to_lowercase())) .map(|(index, line)| (line, index + 1)) // 若需要从1开始计数则加1,从0开始可直接用index .collect()
关键说明
enumerate会将原迭代器的每个元素转换为(索引, 元素)的元组,索引从0开始自动递增,无需手动维护计数变量filter闭包仅关注元素是否匹配,不再修改外部变量,彻底避免了借用冲突map闭包直接从enumerate的元组中获取当前匹配元素的索引,保证序号与元素一一对应
内容的提问来源于stack exchange,提问作者TomZz
相关产品推荐
相关产品推荐

