为何std::iter::Peekable::peek方法会可变借用self参数?
为什么Rust迭代器的
peek()方法需要可变借用self? 直接说结论:peek()需要可变借用,是因为它内部会提前取出迭代器的下一个元素并缓存,这个缓存过程需要修改自身状态,同时调用next()本身也要求可变借用迭代器。
结合你贴的peek()实现代码来看:
- 这个方法属于
Peekable适配器,它内部有两个核心字段:iter(被包装的原迭代器)和peeked(一个Option类型,用来缓存提前取出的元素)。 - 第一次调用
peek()时,self.peeked是空的,所以会执行iter.next()——而next()方法本身就需要可变借用原迭代器(因为它会推进迭代器的内部状态),取出的元素会被存在peeked里。 - 之后再调用
peek(),直接返回peeked里元素的引用,不会再操作原迭代器。 - 当你后续调用
next()时,Peekable的next()会先检查peeked有没有缓存的元素,如果有就直接返回这个元素,而不是调用原迭代器的next(),这样就保证了peek()对外表现出"不推进迭代器"的语义——调用者后续取元素不会跳过任何内容。
所以调用peek()时,被修改的是Peekable实例的peeked缓存字段;第一次调用时,还会间接修改被包装的原迭代器(因为调用了它的next())。
本质上,peek()的"不推进迭代器"是对外暴露的语义,但内部为了实现这个语义,必须提前取出元素缓存,这个过程需要修改自身状态,因此必须声明为可变借用。
内容的提问来源于stack exchange,提问作者anilbey
相关产品推荐
相关产品推荐

