【问题标题】:Rust peekable double referenceRust 可窥视的双重参考
【发布时间】:2022-11-15 05:53:28
【问题描述】:

为什么可窥视迭代器会在选项中返回双重引用?

struct Foo {}
let mut foovec = vec![];
foovec.push(Foo {});
let mut iter = foovec.iter().peekable();
let next = iter.peek();

nextOption<&&Foo>,而不是Option<&Foo>

我如何让它成为后者?

我不想使用 .into_iter() 因为我不想使用 vec。我只想借用一个包含在选项中的 Foo 结构的引用。

【问题讨论】:

    标签: rust iterator


    【解决方案1】:

    peek 产生对您正在迭代的任何内容的引用。如果这也是引用,它将产生双重引用。您可以使用 copied Option adapter 删除该级别的间接:

    struct Foo {}
    let mut foovec = vec![];
    foovec.push(Foo {});
    let mut iter = foovec.iter().peekable();
    // use `copied` here to go from Option<&&_> to Option<&_>
    let next = iter.peek().copied();
    

    或者,您可以在确认需要 peeked 值后调用 next

    struct Foo {}
    let mut foovec = vec![];
    foovec.push(Foo {});
    let mut iter = foovec.iter().peekable();
    if is_okay(iter.peek()) {
        let next = iter.next(); // `next` has type `&Foo`
    }
    

    您甚至可以使用模式匹配来删除一级间接寻址:

    if let Some(&next) = iter.peek() {
        // `next` has type `&Foo` in this block
    }
    

    【讨论】:

    • 谢谢你。看起来 .copied() 只是提取引用,实际上并没有复制底层的 Foo。似乎相当有效。
    • @ccleve 它几乎肯定会编译为无操作。
    猜你喜欢
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-12
    • 2014-02-19
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    相关资源
    最近更新 更多