Rust迭代Vec<Lanternfish>报unsatisfied trait bounds错误如何解决
错误原因
Vec本身没有实现map方法,必须先调用迭代器生成方法(iter()/iter_mut()/into_iter())才能调用map- 你的
decrement_counter方法没有返回值,执行后返回单元类型(),无法直接收集为Vec<Lanternfish> - 要修改
Lanternfish的内部字段,需要拿到元素的可变引用,需要使用可变迭代器 - 示例代码里的方法名拼写错误:
decrement_couner少写了字母n,正确方法名是decrement_counter
修复方案
场景1:原地修改原有鱼群,不需要生成新集合
不需要生成新的Vec,直接遍历可变迭代器执行减1操作即可:
fn part_one(content: &str) { let content: Vec<char> = content.chars().filter(|char| char.is_digit(10)).collect(); let mut fish_list: Vec<Lanternfish> = init_list(content); fish_list.iter_mut().for_each(|fish| fish.decrement_counter()); }
场景2:生成独立的新鱼群集合,不修改原有数据
首先给Lanternfish新增一个返回减1后新实例的方法:
impl Lanternfish { // 原有方法保留,新增如下方法 fn decremented(&self) -> Self { Lanternfish { internal_counter: self.internal_counter - 1 } } }
再通过不可变迭代器生成新集合:
fn part_one(content: &str) { let content: Vec<char> = content.chars().filter(|char| char.is_digit(10)).collect(); let fish_list: Vec<Lanternfish> = init_list(content); let test: Vec<Lanternfish> = fish_list.iter().map(|fish| fish.decremented()).collect(); }
如果不需要保留原有鱼群,也可以直接拿走所有权处理:
let test: Vec<Lanternfish> = fish_list.into_iter().map(|mut fish| { fish.decrement_counter(); fish }).collect();
内容的提问来源于stack exchange,提问作者456c526f
相关产品推荐
相关产品推荐

