gpt4 book ai didi

rust - 返回结构的类型不匹配(预期 ,找到 <&K, &V>)

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

给定以下代码(还没有做太多):

use std::collections::BTreeMap;
use std::iter::FromIterator;

trait Node<K, V> {
fn split(&self) -> Split<K, V>;
}

#[derive(Debug, Copy, Clone)]
pub struct Config {
data_b: usize,
}

struct Split<'a, K, V> {
left: Box<Node<K, V> + 'a>,
right: Box<Node<K, V> + 'a>,
}

#[derive(Debug)]
pub struct DataNode<K, V> {
cfg: Config,
children: BTreeMap<K, V>,
}

impl<K: Clone + Ord, V: Clone> Node<K, V> for DataNode<K, V> {
fn split(&self) -> Split<K, V> {
let data_b = self.cfg.data_b;

Split {
left: Box::new(DataNode {
cfg: self.cfg.clone(),
children: BTreeMap::from_iter(self.children.iter().take(data_b))
}),
right: Box::new(DataNode {
cfg: self.cfg.clone(),
children: BTreeMap::from_iter(self.children.iter().rev().take(data_b))
}),
}
}
}

编译器报如下错误:

error[E0308]: mismatched types
--> lib.rs:68:9
|
68 | Split {
| ^ expected type parameter, found &K
|
= note: expected type `Split<'_, K, V>`
= note: found type `Split<'_, &K, &V>`

我是 Rust 的新手,所以我不确定是什么原因造成的。明确地说,我的问题不是错误消息的意思。显然,这意味着我没有返回正确的类型。问题是为什么编译器解释这个 Split {...}代码作为返回 Split<'_, &K, &V> 的代码当我期望它是 Split<'_, K, V> .感谢任何见解。

最佳答案

引用来自您迭代子项以构建新的 BTreeMap 的位置:

BTreeMap::from_iter(self.children.iter().take(data_b))

如果您查看 iterator returned by BTreeMap::iter()Item 类型是:

type Item = (&'a K, &'a V)

即迭代器返回对内容的引用对。这是有道理的,因为您不想在迭代时将项目移出 map ,或者依赖于 Copy

这与例如Vec::iter(),是一对引用而不是对一对的引用。这确实有道理,因为对一对的引用意味着容器必须在内部实际包含这些对(限制内部数据结构)。

最简单的事情就是克隆键和值:

BTreeMap::from_iter(self.children.iter()
.map(|(&a, &b)| (a.clone(), b.clone()))
.take(data_b))

关于rust - 返回结构的类型不匹配(预期 <K, V>,找到 <&K, &V>),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40813959/

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