更新Rust集合内的对象

ksc*_*ath 0 rust

我想修改存储在Rust集合(BTreeSet)中的对象。

我想在这里实现以下目标:

use std::collections::BTreeSet;

#[derive(Eq, PartialEq, Ord, PartialOrd, Debug)]
struct X {
    key: String,
    val: Option<i32>,
}

fn main() {

    let mut set: BTreeSet<X> = BTreeSet::new();
    set.insert(X {
        key: "a".to_string(),
        val: Some(1),
    });
    set.insert(X {
        key: "b".to_string(),
        val: Some(1),
    });

    nonify(&mut set, "a".to_string());

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

fn nonify(set: &mut BTreeSet<X>, k: String) {
    for mut s in set.iter() {
        if s.key == k {
            s.val = None;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是行不通的,因为s不是可变引用。

我该如何在锈病中完成类似的工作?

ape*_*lla 5

以程序逻辑的方式修改对象(BTreeSet顺序更改)是不安全的,因为这样做会破坏集合的内部结构-以下是相关文档的摘录:

逻辑上的错误是,要对商品进行修改,使该商品相对于任何其他商品的排序(由Ord特性决定)在设置时会发生变化。通常只能通过Cell,RefCell,全局状态,I / O或不安全代码来实现。

我不知道您的确切用例,但是由于您似乎正在使用键值对,因此HashMapBTreeMap可能在这里起作用:它们不允许出于相同的原因而对键进行突变,但是与键可能会被更改。