gpt4 book ai didi

rust - 为什么 HashMap 有 iter_mut() 而 HashSet 没有?

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

HashMap 提供 iter_mut 函数的设计原理是什么?但不是HashSet在使用rust ?

自己动手(假设甚至可以做到)会不会失礼?

有一个可以减轻引起的情况

previous borrow of X occurs here; the immutable borrow prevents subsequent moves or mutable borrows of X until the borrow ends

例子

An extremely convoluted example (Gist)这并没有说明为什么参数传递是这样的。有一个简短的评论来解释痛点:

use std::collections::HashSet;

fn derp(v: i32, unprocessed: &mut HashSet<i32>) {
if unprocessed.contains(&v) {

// Pretend that v has been processed
unprocessed.remove(&v);
}
}

fn herp(v: i32) {
let mut unprocessed: HashSet<i32> = HashSet::new();
unprocessed.insert(v);

// I need to iterate over the unprocessed values
while let Some(u) = unprocessed.iter().next() {

// And them pass them mutably to another function
// as I will process the values inside derp and
// remove them from the set.
//
// This is an extremely convoluted example but
// I need for derp to be a separate function
// as I will employ recursion there, as it is
// much more succinct than an iterative version.
derp(*u, &mut unprocessed);
}
}

fn main() {
println!("Hello, world!");
herp(10);
}

声明

while let Some(u) = unprocessed.iter().next() {

是不可变的借用,因此

derp(*u, &mut unprocessed);

是不可能的,因为 unprocessed 不能被可变地借用。不可变借用直到 while 循环结束才结束。

我试过使用this as reference并最终试图通过各种排列的赋值、括起来的大括号来欺骗借用检查器,但由于预期表达式的耦合,问题仍然存在。

最佳答案

你要考虑一下 HashSet 实际上是。 IterMut 你从 HashMap::iter_mut() 得到的仅在值部分可变:(&key, &mut val) , ( (&'a K, &'a mut V) )

HashSet基本上是一个 HashMap<T, ()> ,因此实际值是键,如果您要修改键,则必须更新它们的哈希值,否则您会得到无效的 HashMap。 .

关于rust - 为什么 HashMap 有 iter_mut() 而 HashSet 没有?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35970238/

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