将结构插入映射时如何使用结构的成员作为其自己的键而不重复它?

2024-02-08

是否可以将结构插入到映射中,其中键由所插入的值拥有?

当在 C 中使用哈希映射时,这是我习惯做的事情。

伪代码示例:

struct MyStruct {
    pub map: BTreeMap<&String, StructThatContainsString>,
    // XXX            ^ Rust wants lifetime specified here!
}

struct StructThatContainsString {
    id: String,
    other_data: u32,
}

fn my_fn() {
    let ms = MyStruct { map: BTreeMap::new() };

    let item = StructThatContainsString {
        id: "Some Key".to_string(),
        other_data: 0,
    }

    ms.insert(&item.id, item);
}

这种情况该如何正确处理呢?


  • 如果这是不可能的,是否可以进行相反的操作,其中该值保存对键的引用,该键将是String ?

  • 另一种选择是使用set代替map,然后存储整个struct作为键,但在比较时仅使用其值之一(看起来它会起作用,但如果你想比较的话可能会适得其反struct在其他情况下).


它不适用于普通引用:

let item = StructThatContainsString {
    id: "Some Key".to_string(),
    other_data: 0,
}

ms.insert(&item.id, item);

item is moved到地图中,因此不能有任何待处理的借用/引用。

另外,像这样的方法get_mut() https://doc.rust-lang.org/1.8.0/collections/struct.BTreeMap.html#method.get_mut会变得危险或不可能,因为它会让您修改具有突出引用的项目。

假设想要这样做的原因是为了节省空间,明显的选择是:

  • 从值结构中取出键。如果您同时需要它,您可以在映射中查找键时获得它,或者迭代器同时包含键和值:

    struct OnlyKey {
        id: String,
    }
    
    struct OnlyValue {
        other_data: u32,
    }
    

    这可以通过适当的方法来分解/重新组合各个部分来清理。

  • 使用类似的东西Rc为值的关键部分。Rc<T>实施Ord(需要BTreeMap) if T does.

    struct StructThatContainsString {
        id: Rc<String>,
        other_data: u32,
    }
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将结构插入映射时如何使用结构的成员作为其自己的键而不重复它? 的相关文章

  • 如何使用 Warp 检查授权标头?

    我正在使用 Rust 和 Warp 构建 graphql api 我已经浏览了文档 但我仍然不知道如何链接过滤器 特别是检查authorization在请求头中 let context extractor warp any this cod
  • 使用推断的 (?) 类型克隆 std::iter::Map

    我在以紧凑的方式克隆地图时遇到问题 extern crate itertools num use itertools num linspace fn main 440Hz as wave frequency middle A let fre
  • 相同代码的货物构建:虚假的编译时错误?

    我有板条箱A取决于B and B取决于rust nmea https github com Dushistov rust nmea crate 如果我建造箱子A我遇到了很多错误 所有错误都错过了 use std error Error 在构
  • 在 FFI 中使用 ptr::NonNull 是否有效?

    铁锈具有ptr NonNull https doc rust lang org beta std ptr struct NonNull html代表非的类型NULL指针 在 FFI 中使用这种类型安全吗 是否保证具有相同的二进制表示形式 忽
  • 为什么在 Rust 中无法在不引用其中之一的情况下连接两个字符串?

    这有效 let hello Hello to string let world world let hello world hello world 但这并没有 let hello Hello to string let world worl
  • 什么时候适合使用关联类型而不是泛型类型?

    In 这个问题 https stackoverflow com q 32053402 155423 出现了一个问题 可以通过将使用泛型类型参数的尝试更改为关联类型来解决 这引发了一个问题 为什么关联类型在这里更合适 这让我想了解更多 The
  • 如何迭代每隔一个数字

    阅读文档时 我注意到一句话 Rust 没有C stylefor 循环 所以 我想知道 如何制作一个相当于for i 0 i lt 10 i 2 我能想到的方法是这样的 for i in 0 10 if i 2 0 Do stuff Or e
  • Rust 双与号,&&

    我看到一些代码如下所示 fn test lt a gt a mut a str 我知道 a 是一生 而 是引用 但是我很难理解双重引用 根据我的理解 引用是一个指针 那么 是指向另一个指针还是其他指针的指针 根据我的理解 引用是一个指针 是
  • 货运公司如何决定是否重建部门?

    我正在考虑跳过货物中的依赖关系构建步骤 我有一个简单的项目 使用 3 个板条箱作为依赖项 在Cargo toml 我使用一次构建项目cargo build release 现在我有另一个项目 它使用其中提到的相同依赖项Cargo toml文
  • 如何区分缺少的反序列化字段和空字段?

    我想用Serde https serde rs 将一些 JSON 解析为 HTTP PATCH 请求的一部分 由于 PATCH 请求不传递整个对象 仅传递要更新的相关数据 因此我需要能够区分未传递的值和显式设置为的值null 以及存在的值
  • 为什么 rust 'pub fn func(&'a mut self)' 在运行后被认为是“可变借用”?

    tl dr given pub fn func a mut self 为什么是self被认为是 可变借用 after func已经跑了 给出以下最小可行示例 pub struct Struct1 lt a gt var a u8 impl
  • 无约束类型参数错误

    我正在尝试将 glium 与 cgmath 连接起来 下列的这个答案 https stackoverflow com a 40028032 5397009 我已经实现了ToArray要转换实例的特征cgmath Matrix4转换成 gli
  • 如何操作 Rust 数组的 2 个可变切片?

    我有一个函数需要对单个数组的两个部分进行操作 目的是能够建立一个 nostd 分配器 可以将更大数组的变量切片返回给调用者 并保留数组的其余部分以供将来分配 这是失败的示例代码 fn split lt a gt mut item a mut
  • 如何使用自定义 llc 编译 Rust 程序?

    我有一个自定义 LLVM 后端 并且想为该自定义 nostd 目标交叉编译 Rust 我想分两步编译 Rust 程序 Using rustc生成 LLVM IR 用我自己的opt and llc将 LLVM IR 转换为机器代码 我尝试使用
  • 在 Rust 中使用结构体的生命周期的正确方法是什么?

    我想写这样的结构 struct A b B c C struct B c C struct C The B c应该借自A c A gt b B gt c C borrow from c C lt 这是我尝试过的 struct C struc
  • 带填充零的十六进制格式

    将整数类型格式化为十六进制字符串时 我无法让它用零填充数字 println 4x 0x0001 as u16 gt 0x1 but expected 0x0001 println 02x 0x0001 as u16 gt 0x1 same
  • 泛型函数的不同实例是否可以具有不同的静态变量?

    当我在泛型函数中使用静态变量时 泛型函数的每个实例中的变量实体都是相同的 例如 在这段代码中 fn foo
  • 如何匹配特质实现者

    我有一个由某些结构实现的特征 我想编写一个模式匹配 可以处理每种可能的情况 trait Base struct Foo x u32 struct Bar y u32 impl Base for Foo impl Base for Bar f
  • vscode 在哪里使用 lldb 可执行文件?

    我在 vscode 中调试 rust 时遇到困难 它无法评估任何涉及函数的表达式 我注意到我没有安装 lldb Ubuntu 20 04 但调试器仍在运行 在哪里可以找到 lldb 可执行文件 我可以改变路径吗 None
  • Rust 中为什么有 mod 关键字?

    看完之后this https doc rust lang org book crates and modules html 我想知道为什么有一个mod关键字和mod rs 我假设目录层次结构也可以描述模块 必须显式声明模块有几个原因 模块可

随机推荐