【问题标题】:How to unpack BTreeMap item tuple from an iterator in Rust?如何从 Rust 中的迭代器中解压缩 BTreeMap 项元组?
【发布时间】:2016-06-06 22:33:41
【问题描述】:

Here 是示例代码:

use std::collections::BTreeMap;

fn main() {
    let mut map: BTreeMap<u8, Vec<u8>> = BTreeMap::new();
    let idx = map.iter_mut().find(|t| {
        let (&k, &mut v) = t;
        v.is_empty()
    });
    idx.map(|t| {
        let (&k, &mut v) = t;
        v.push(5);
    });
}

错误:

<anon>:6:13: 6:25 error: mismatched types:
 expected `&(&u8, &mut collections::vec::Vec<u8>)`,
    found `(_, _)`
(expected &-ptr,
    found tuple) [E0308]
<anon>:6         let (&k, &mut v) = t;
                     ^~~~~~~~~~~~

元组的类型是&amp;(&amp;u8, &amp;mut collections::vec::Vec&lt;u8&gt;),所以我希望它可以通过以下方式解包:

let (&k, &mut v) = *t;

但是

<anon>:10:28: 10:30 error: type `(&u8, &mut collections::vec::Vec<u8>)` cannot be dereferenced
<anon>:10         let (&k, &mut v) = *t;
                                     ^~

如何解压并用于可变目的?

【问题讨论】:

    标签: dictionary rust


    【解决方案1】:

    查看错误信息:

     expected `&(&u8, &mut collections::vec::Vec<u8>)`,
        found `(_, _)`
    (expected &-ptr,
        found tuple) [E0308]
    

    编译器希望匹配一个引用,但代码没有提供这样的。将绑定更改为let &amp;(&amp;k, &amp;mut v) = t。然后你会得到一堆其他错误:

    1. 使用&amp;mut foo 进行匹配意味着foo 将剥离&amp;mut,然后将结果值移动foo。这是因为它是一种模式匹配,就像 let Some(foo) = ... 如何“剥离”Some

    2. 你不能移动Vec,因为它归BTreeMap所有,所以你需要引用它。这是通过ref 关键字完成的,而不是&amp; 运算符。

    3. 通常,您也可以直接在闭包参数中进行模式匹配,而不是在第二个变量中。

    4. 由于map 将项目的所有权转移给闭包,您可以只给它一个mut 绑定,不需要任何引用。

    5. 由于 k 未使用,因此习惯用下划线 (_) 替换名称。

    let idx = map.iter_mut().find(|&(k, ref v)| {
        v.is_empty()
    });
    
    idx.map(|(_, mut v)| {
        v.push(5);
    });
    

    用于可变目的

    如果您的意思是“我如何将闭包中的值更改为 find”,答案是“您不能”。 Find 返回对迭代项的不可变引用 (&amp;Self::Item):

    fn find<P>(&mut self, predicate: P) -> Option<Self::Item> 
        where P: FnMut(&Self::Item) -> bool
    

    即使您的 Self::Item 可能是可变引用,对可变引用的不可变引用仍然是不可变的。

    【讨论】:

    • 优秀的答案。还要感谢结果代码并注意到ref 不是&amp;,我认为是相同的东西。
    猜你喜欢
    • 2015-08-28
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    • 1970-01-01
    • 2015-09-11
    相关资源
    最近更新 更多