Rust 返回的结构的类型不匹配(预期为<;K,V>;,发现为<;K,&;V>;)

Rust 返回的结构的类型不匹配(预期为<;K,V>;,发现为<;K,&;V>;),rust,Rust,给出以下代码(目前还做不了多少): 使用std::collections::BTreeMap; 使用std::iter::FromIterator; 特征节点{ fn拆分(&self)->拆分; } #[派生(调试、复制、克隆)] 发布结构配置{ 数据:使用, } 结构拆分, 右:盒子` =注意:找到类型'Split。任何洞察都将不胜感激。引用来自您迭代子对象以构建新的BTreeMap: BTreeMap::from_iter(self.children.iter().take(data_b))

给出以下代码(目前还做不了多少):

使用std::collections::BTreeMap;
使用std::iter::FromIterator;
特征节点{
fn拆分(&self)->拆分;
}
#[派生(调试、复制、克隆)]
发布结构配置{
数据:使用,
}
结构拆分,
右:盒子`

=注意:找到类型'Split
。任何洞察都将不胜感激。

引用来自您迭代子对象以构建新的
BTreeMap

BTreeMap::from_iter(self.children.iter().take(data_b))
如果查看,则
类型为:

type Item = (&'a K, &'a V)
i、 迭代器返回对内容的引用。这是有意义的,因为您不希望在迭代时将项目移出映射,或者依赖于
Copy

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

最简单的方法是克隆密钥和值:

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

引用来自您迭代子对象以构建新的
BTreeMap

BTreeMap::from_iter(self.children.iter().take(data_b))
如果查看,则
类型为:

type Item = (&'a K, &'a V)
i、 迭代器返回对内容的引用。这是有意义的,因为您不希望在迭代时将项目移出映射,或者依赖于
Copy

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

最简单的方法是克隆密钥和值:

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

你明白吗?你知道这是怎么回事吗?在我看来,错误信息非常简单——你说你要返回一个东西,但你返回了另一个东西。我们可以进一步澄清哪些信息缺失?我没有说我不理解错误消息。我不明白的是为什么我写的结果是
split你明白吗?你知道这是怎么回事吗?在我看来,错误信息非常简单——你说你要返回一个东西,但你返回了另一个东西。我们可以进一步澄清哪些信息缺失?我没有说我不理解错误消息。我不明白的是,为什么我写的东西会导致
split。感谢您的清晰解释和指向一个可能的解决方案。你说得对,这确实有道理。我确实检查了我所使用的各种方法中的类型,但我被那些文件误导了,这些文件说
fn iter(&self)->iter
,所以我挠头了。现在我知道我应该去哪里找了。我在在线文档中点击了很多类型!你学到了各种各样的东西。感谢你的清晰解释和指出一个可能的解决方案。你说得对,这确实有道理。我确实检查了我所使用的各种方法中的类型,但我被那些文件误导了,这些文件说
fn iter(&self)->iter
,所以我挠头了。现在我知道我应该去哪里找了。我在在线文档中点击了很多类型!你能学到各种各样的东西。