枚举变体可以具有恒定的关联值吗? [复制]

2024-02-18

我有代码():

use std::collections::HashMap;

// We have some arbitrary struct (given values just placeholders)
struct SomeStruct {
    x: f32,
    y: usize,
}

fn main() {
    // We have some hashmap which contains the names (keys) and properties (values) of items.
    //  These are known at compile time.
    let hashmap: HashMap<&str, SomeStruct> = vec![
        ("a", SomeStruct { x: 2., y: 2 }),
        ("b", SomeStruct { x: 3.5, y: 1 }),
        ("c", SomeStruct { x: 0., y: 5 }),
    ]
    .into_iter()
    .collect();

    // We then have a bunch of data which arbitrarily references the names of these items.
    //  This data is also known at compile time.
}

不断打字"a","b"等需要引用的项目是不好的。

可以使用枚举来改善这一点,例如:

enum Items {
    A = SomeStruct { x: 2., y: 2 },
    B = SomeStruct { x: 3.5, y: 1 },
    C = SomeStruct { x: 0., y: 5 },
}

这实际上是一个const枚举,这样当将来引用这些项目时我们可以简单地这样做Items::A or &Items::A而不是'a'并且必须进行必要的哈希处理。

看来这样做是行不通的。

有没有办法使用const enum?或者有其他更好的解决方案吗?

虽然这个问题可能是重复的如何在 Rust 中创建具有常量值的枚举? https://stackoverflow.com/questions/36928569/how-can-i-create-enums-with-constant-values-in-rust使用任意结构时,该问题下提出的解决方案不起作用。这添加了瓦伦丁溶液 https://stackoverflow.com/a/62759540/155423确实如此,但这个解决方案确实更适用于其他解决方案不起作用的情况。我认为它在这个问题的背景下提供了一个更好更清晰的答案,而其他更简单的解决方案不起作用。


您可以使用相关常数 https://doc.rust-lang.org/edition-guide/rust-2018/trait-system/associated-constants.html, 这类似于bitflags https://crates.io/crates/bitflags板条箱工作。如果你添加#[non_exhaustive] to Items,你可以阻止实例化Items.

#[non_exhaustive]
struct Items;

impl Items {
    pub const A: SomeStruct = SomeStruct { x: 2., y: 2 };
    pub const B: SomeStruct = SomeStruct { x: 3.5, y: 1 };
    pub const C: SomeStruct = SomeStruct { x: 0., y: 5 };
}

或者,如果您使用 Nightly,则可以使用 const 方法进行匹配const_if_match。这也是最近稳定下来 https://github.com/rust-lang/rust/pull/72437.

#![feature(const_if_match)]

enum Items {
    A,
    B,
    C,
}

impl Items {
    const fn value(self) -> SomeStruct {
        use Items::*;
        match self {
            A => SomeStruct { x: 2.0, y: 2 },
            B => SomeStruct { x: 3.5, y: 1 },
            C => SomeStruct { x: 0., y: 5 },
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

枚举变体可以具有恒定的关联值吗? [复制] 的相关文章

随机推荐

  • 无法使用 boto3 从 DynamoDB StringSet 中删除项目

    我有一个包含 StringSet 类型的属性的表 属性名称是allDevices 我正在尝试从 StringSet 中删除设备 ID 但是 当我运行以下代码时 它不会从 StringSet 中删除字符串 它也不会抛出任何错误 尝试删除 de
  • 如何创建自定义 Eclipse 语法荧光笔

    我一直在为一种新语言开发编译器 我认为能够在语法感知环境中展示其开发会很棒 该语言有相当多的自定义关键字 其结构与 Java 或 C C 等常见语言有显着不同 如何为 Eclipse 开发自定义语法荧光笔 我已经看到了一些对一些插件的参考
  • Qt 5.3。 QtWidgets:没有这样的文件或目录#include

    我想编译 Qt 示例 我收到错误 QtWidgets 没有这样的文件或目录 include greaterThan QT MAJOR VERSION 4 QT widgets does not help QT widgets does no
  • 我什么时候应该使用 Android Jetpack Compose 的 Surface 可组合项?

    有一个Surface https developer android com reference kotlin androidx compose material package summary surfaceJetpack Compose
  • jQuery.active 函数

    我试图找到有关以下 jQuery 函数的更多信息 jQuery active 它被描述为测试与服务器的活动连接数 并且当连接数为零时评估为 true 我在 jQuery 网站上找不到有关此功能的任何信息 并且想知道是否有人知道我可以在哪里找
  • 如何使用索引查找所有大于的值

    我一直在这个网站和其他网站上研究我的情况 这是最接近我的问题 解决方案的 查找大于或等于某个值的所有值 https stackoverflow com questions 23941500 find all values greater o
  • Pascal中字符串到整数的转换,怎么做?

    如何将字符串中打印的数字转换为整数 谢谢 程序 Val procedure Val S var V var Code Integer 此过程对小数和实数进行操作 参数 S 字符序列 为了正确转换 它必须包含 0 9 V 转换结果 如果结果是
  • 使用 CSS -fx-shape 绘制区域。怎么可能呢?

    我正在寻找一种在区域中绘制形状的方法 JavaFX8 我见过一些设置区域样式的示例 如下所示 fx shape M 3 0313 0 L 0 74 L 7 9688 74 L 4 9375 0 L 3 0313 0 Z 谁能解释一下这个字符
  • 如何在 Firefox 中清除 Service Worker 缓存?

    在 Chrome 中 可以从开发工具中清除 Service Worker 缓存 我们如何在 Firefox 中实现这一目标 到目前为止我已经尝试过 取消注册服务about serviceworkers 清空下面的缓存about prefer
  • Maven - 覆盖测试资源文件夹

    我在 Maven 和 Eclipse 中进行测试时遇到问题 我从 Eclipse 运行我的测试套件 一切正常 但是当我运行时 mvn test 我有一个例外 当我尝试读取测试用例中的一些文件时 它会出现 如下所示 final File ja
  • 无后端的 PWA 通知

    我正在使用 Javascript PWA 制作一个待办事项应用程序 待办事项会有提醒 我想向用户发送通知以提醒他们 任务和提醒时间将存储在localStorage中 所以现在我想在没有任何后端的情况下发送通知 我尝试过一些教程 它们都需要后
  • 为什么在 recyclerview android 中滚动后突出显示的项目会丢失

    我想在适配器类中的操作模式处于活动状态时突出显示该项目 我可以这样做 但滚动后突出显示状态消失了 我尝试了各种解决方案 但我不知道为什么会发生这种情况 public class MyAdapter extends RecyclerView
  • SQL:级联UNION和JOIN

    我在两个表之间进行联合操作 SELECT ID 1 name 1 surname 1 FROM T ONE UNION SELECT ID 2 name 2 surname 2 FROM TABLE 2 我想加入这个结果UNION与另一个表
  • 为什么我构建flutter web时会出现白屏

    我想构建一个 flutter web 应用程序 所以我输入 webdev build 命令 操作完成后 我打开位于构建目录中的 index html 文件 它只是一个白屏 我在一个新项目上尝试过 问题仍然存在 开发过程中没有问题 这是我的
  • PHP post_max_size 与 upload_max_filesize 有什么区别?

    当尝试上传PDF通过为此创建的管理区域创建的 15mb 文件 没有任何反应 没有成功或错误消息 但PDF没有上传 然后我认为这可能是一个问题php ini设置 果然 当我查看文件时 发现限制被设置为8m 我假设这意味着 8mb 帖子最大大小
  • Rails 3.1rc4 defaults.js 未找到

    我有一个全新的 Rails 3 1rc4 项目 生成脚手架 迁移并创建新条目后 我注意到我无法销毁刚刚创建的条目 结果发现 assets defaults js 找不到 所以没有弹出销毁确认对话框 我认为这可能与新的资产管道有关 但寻找解决
  • UINavigationBar 左侧有两个按钮

    我知道在 stackoverflow 上有很多类似的问题 但我的有点不同 我将用图像来展示这一点 因为它更容易理解 使用我从中获取的代码here http www mattdipasquale com blog 2010 11 02 how
  • 用户表单多页禁用选项卡单击

    我有一个带有多页选项卡的用户窗体 每个选项卡内都有一个 下一个 命令按钮 如果没有错误 您可以使用该按钮移动到下一个选项卡 如果有错误 它会提示用户并将焦点设置为该选项卡上出现错误 当用户窗体打开时 我可以单击选项卡来跳转 而无需完成任何违
  • django.template.library.InvalidTemplateLibrary:指定的模板库无效

    我正在尝试构建一个博客应用程序 运行 makemigrations 和 migrate 并创建超级用户 但我在运行服务器时遇到以下错误 django template library InvalidTemplateLibrary 指定的模板
  • 枚举变体可以具有恒定的关联值吗? [复制]

    这个问题在这里已经有答案了 我有代码 use std collections HashMap We have some arbitrary struct given values just placeholders struct SomeS