据我所知,我不应该有一个可变的引用到一个不可变的数据片段.因此,如果我想创建一些struct
,它基于内部状态的变化实现Iterator
,那么我必须将该struct
的任何实例声明为可变的,以便能够创建所需的可变引用.
为了进行演示,我构造了一个简单的示例,如下所示:
struct MyIter {
internal_state: u32
}
impl MyIter {
fn new() -> MyIter {
MyIter{ internal_state: 0 }
}
}
impl Iterator for MyIter {
type Item = u32;
fn next(&mut self) -> Option<u32> {
self.internal_state += 1;
Some(self.internal_state)
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::iter::zip;
#[test]
fn mutable_declaration_no_zip() {
let mut my_iter = MyIter::new();
assert_eq!(my_iter.next(), Some(1));
assert_eq!(my_iter.next(), Some(2));
assert_eq!(my_iter.next(), Some(3));
}
}
这段代码编译得很好,并通过了测试,但是如果我将测试函数更改为my_iter
的不可变声明,如下所示,则它拒绝使用预期的error[E0596]: cannot borrow 'my_iter' as mutable, as it is not declared as mutable
消息进行编译:
#[test]
fn immutable_declartaion_no_zip() {
let my_iter = MyIter::new();
assert_eq!(my_iter.next(), Some(1));
assert_eq!(my_iter.next(), Some(2));
assert_eq!(my_iter.next(), Some(3));
}
我的问题涉及这样的情况,即我基本上与上面的操作相同,但使用std::iter::zip
来执行迭代.现在发生的情况是,即使我声明my_iter
是不可变的,测试还是编译并通过了,这意味着在幕后zip
已经改变了我传递给它的不可变变量的状态!
#[test]
fn immutable_declaration_zip() {
let my_iter = MyIter::new();
let nums: [u32;10] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
for (i, num) in zip(my_iter, nums.iter()) {
assert_eq!(i, *num);
}
}
那么,有没有人能解释一下为什么要设立zip
来做这件事?zip
如何调用next()
方法,从而生成对我已声明为不可变的数据的可变引用?