gpt4 book ai didi

rust - 使用对另一个 HashMap 的引用克隆一个 HashMap

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

我有一个哈希图的引用(下面代码中的 data),我想将它克隆到一个新的、拥有的哈希图。克隆引用给了我一个新的引用,这不是我需要的。

我还尝试对 data 进行迭代 + 映射单独引用和克隆键和值对,然后是一个集合,但这也不起作用。这是一个最小的工作示例:

use core::cell::Cell;
use std::collections::HashMap;
use std::collections::HashSet;
use std::rc::Rc;

struct Dummy<K, V> {
dirty: Rc<Cell<bool>>,
data: Cell<Option<HashMap<K, HashSet<V>>>>,
}

impl<K, V> Dummy<K, V> {
fn persist(&self, prefix: &str, data: &HashMap<K, HashSet<V>>) {
self.dirty.set(true);
self.data.set(Some(data.clone()));
}
}

这给出了以下错误:
error[E0308]: mismatched types
--> src/lib.rs:14:28
|
14 | self.data.set(Some(data.clone()));
| ^^^^^^^^^^^^ expected struct `std::collections::HashMap`, found reference
|
= note: expected type `std::collections::HashMap<K, std::collections::HashSet<V>>`
found type `&std::collections::HashMap<K, std::collections::HashSet<V>>`

( Permalink to the playground )

这段代码的目的是通过 Dummy观察hashmap上的内容。 struct,用于单元测试。

我猜这个问题是因为给定泛型类型没有办法确定如何深度克隆键和值对象?

有没有办法在给定对现有哈希图的引用的情况下创建新的哈希图?

最佳答案

正如评论所暗示的,这是 Rust 如何通过引用/autoderef 查找方法的一个有点不幸的交互:

The implementation of Clone on HashMap 要求键和值(和哈希器)为 Clone以及。这是有道理的,因为我们只能克隆 HashMap如果我们可以克隆它的内容。如果其中任何一个没有实现 Clone , HashMap不实现 Clone .

您的 impl<K, V>关于 Clone 没有任何限制.那么为什么要调用 data.clone()甚至工作?那是因为有一个 implementation of Clone on any reference ,它为您提供引用的副本。

由于您的 impl<K, V>K 没有限制或 V ,编译器只会找到Clone -在原语上实现 & - 类型适用。如果您需要 K: Clone, V: Clone , HashMap自己的 Clone -impl 适用( S 默认已经是 Clone)。

看这个例子:

// This returns a cloned HashMap
// because Rust uses the Clone-implementation on HashMap
fn do_clone<K: Clone, V: Clone>(data: &HashMap<K,V>) -> HashMap<K, V> {
data.clone()
}

// There is no viable Clone-implementation on the HashMap
// because K & V are not Clone. But there is an implementation
// on the primitive reference type.
fn do_clone_ref<K, V>(data: &HashMap<K,V>) -> &HashMap<K, V> {
data.clone()
}

关于rust - 使用对另一个 HashMap 的引用克隆一个 HashMap ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59373165/

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