为什么迭代器变量需要可变

tom*_*mas 2 iterator rust

我是 Rust 场景的新手。仍在学习所有权、借用、生命周期等的细节。我的整个职业生涯都在使用 NodeJS。

use battery::Manager;
use spin_sleep::sleep;
use std::time::Duration;
fn main() {
    loop {
        if let Ok(manager) = Manager::new() {
            if let Ok(batteries) = manager.batteries() {
//                    ^^^^^^^^^ - This variable
//Rust analyzer tells me to make it mutable and it is fixed when I do so
                if let Some(Ok(battery)) = batteries.next() {
                    println!("Vendor: {:?}", battery.vendor());
                    println!("Model: {:?}", battery.model());
                    println!("State: {:?}", battery.state());
                    println!("Charge: {:?}", battery.state_of_charge());
                    println!("Time to full charge: {:?}", battery.time_to_full());
                    println!("");
                }
            }
        }
        sleep(Duration::from_secs(180));
    }
}
Run Code Online (Sandbox Code Playgroud)

Den*_*ret 7

每次调用 时batteries.next(),您都会得到不同的值(或None完成时)。

这是因为迭代器具有内部状态,例如可以是引用集合中的索引。

调用next会更改此内部状态,这意味着迭代器必须静音。

  • @tomas这与迭代器返回的值(可能是带有 IterMut 的可变引用)无关,而是与迭代器有关。`manager.batteries()` 返回一个迭代器,并且该迭代器必须是可变的才能调用 `next()`。 (2认同)