【问题标题】:Why does an iterator variable need to be mutable为什么迭代器变量需要是可变的
【发布时间】:2021-12-26 07:14:29
【问题描述】:

我是锈迹斑斑的新手。仍在学习所有权、借款、生命周期等方面的细节。我的整个职业生涯都在使用 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));
    }
}

【问题讨论】:

    标签: rust iterator


    【解决方案1】:

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

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

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

    【讨论】:

    • 好的,所以电池是一个迭代器,由于迭代器改变了它的状态,它必须是可变的,但是它给出的值是不可变的,因为它是一个引用权?
    • next 方法的签名是:fn next(&mut self) -> Option<Self::Item>。它需要&mut self,但你给它&self。使用mut batteriesbatteries 变量指定为可变的将为您提供next 方法所需的引用类型。
    • @tomas 这与迭代器返回的值无关(可能是带有 IterMut 的可变引用),而是与迭代器有关。 manager.batteries() 返回一个迭代器,这个迭代器必须是可变的才能调用 next()
    猜你喜欢
    • 1970-01-01
    • 2019-12-18
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 2021-02-03
    • 2014-10-28
    • 1970-01-01
    • 2014-05-08
    相关资源
    最近更新 更多