gpt4 book ai didi

dictionary - 如何从 Rust 中的迭代器解压 BTreeMap 项元组?

转载 作者:行者123 更新时间:2023-11-29 08:14:30 25 4
gpt4 key购买 nike

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;
^~~~~~~~~~~~

元组的类型是&(&u8, &mut collections::vec::Vec<u8>)所以我希望它可以通过以下方式解压:

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;
^~

如何解压它并用于可变用途?

最佳答案

查看错误信息:

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

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

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

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

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

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

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

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

idx.map(|(_, mut v)| {
v.push(5);
});

use for mutable purposes

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

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

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

关于dictionary - 如何从 Rust 中的迭代器解压 BTreeMap 项元组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37658848/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com