rust - 为什么我们不应该在 HashSet::insert 中使用 & ?

标签 rust

我在 C++ 之后学习 Rust。想了解为什么我们不应该在 HashSet::insert() 函数中使用 & 吗?

我们在 HashSet::contains() 函数中使用 & 因为我们不想拥有对象 我希望 insert()

也是如此

我正在阅读文档 https://doc.rust-lang.org/std/collections/struct.HashSet.html#method.insert并理解方法 pub fn insert(&mut self, value: T) -> bool 的签名 为什么我们不使用 &value

我的代码

use std::collections::HashSet;


fn main() {
    let mut hset = HashSet::new();
    let num = 111;

    hset.insert(num);
    if hset.contains(&num) {
        println!("Contains {}", num);
    }

    println!("{:?}", hset);
} 

最佳答案

让我尝试使用一个比喻:您的 HashSet 是一个袋子,而您的 T 是您可以放入该袋子中的事物类型。您拥有该包并负责执行我的请求

所以现在当我使用 HashSet::contains() 时,我拿着一个物体,例如一个红球,我问你:包里有类似的物体吗? 请注意,球是我的,但我让你借用它,这样你就可以用它来与包内的物体进行比较。完成后,您归还借用的对象并回答"is"或“否”。

但是当我使用HashSet::insert()时,我给你球,然后你将同一个球插入袋子中。如果袋子里已经有类似的物体,那么你就把新球扔掉(你不希望袋子里有重复的物体!)并回答“不”。否则,您将球插入袋子并回答"is"。请注意,无论哪种情况,现在我都不再拥有球了。

因此,在 contains() 情况下,您通过 & 传递引用,因为您借用了要使用一段时间的对象。但使用 insert() 时,您可以将对象本身作为拥有的值传递,以便容器能够拥有它。

关于rust - 为什么我们不应该在 HashSet::insert 中使用 & ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76193049/

相关文章:

rust - 如果 Result 在 Vector 中,如何获得 Result 的 Ok 值?

rust - 在使用rust 测试中从底物事件中获取有效负载

rust - 是否可以使用 Pin 在堆栈而不是堆上创建自引用结构?

rust - 关于期望类型的奇怪错误

rust - 如何打印结构和数组?

javascript - 如何在没有命名空间的情况下从 JavaScript 调用 Rust 函数?

iterator - 是否可以将折叠与 Vec 一起使用?

rust - 如何在Rust中将数字四舍五入?

rust - 尝试实现借用一些数据并拥有其他数据的迭代器时出现编译错误

Rust 生命周期,数据流入其他引用