gpt4 book ai didi

types - 强类型枚举作为 rust 中的联合 : How to determine type of value and retrieve it; How to do "constructors"

转载 作者:行者123 更新时间:2023-12-03 11:43:43 26 4
gpt4 key购买 nike

类型化的社区,
来自 C++,我正在寻找一种在 Rust 结构中存储不同类型值的解决方案。
总体思路是将优先级队列存储在 Hashmap 中并按队列名称索引,允许添加条目并按时间戳排序。这些条目应该能够保存先前定义类型的值字段。
用例是能够对值进行版本控制,并在需要时通过附加字段注释值。

在 C++ 中,我将通过从定义的接口(interface)和存储指向该结构的指针的列表的继承,或通过 void 指针和指示枚举字段的类型来做到这一点。

到目前为止,我发现 Rust 使用了一个类型化的枚举。我的问题是“类型转换”是如何工作的(据我了解,在内存安全方面,Rust 中的范式可能与 C++ 中的不同,因为我在 C++ 中执行此操作的方式需要 RTTI 或类型转换)。
在 Rust 中执行此操作的正确方法是什么?

例子:

enum Value {
Int(i64),
Float(f64),
Str(String),
}

struct Entry {
timestamp:i64,
value: Value,
}

struct VersionList {
name: String,
entries: LinkedList<Entry>
}

现在的问题是,如果值的类型未知,Rust 中提取列表值的范式是什么。
一种方法是为每个值类型创建一个方法并在其中有一个匹配表达式,如果匹配则返回具有正确类型的值,否则返回 None。但是,这意味着始终需要调用所有方法,直到其中一个确实返回实际值而不是 None,这会产生大量代码。

例子:
impl Entry {
pub fn get_i64(&self) -> Option<i64> {
match &self.value {
Value::Int(i) => Some(*i),
_ => None
}
}

另外,我意识到 Rust 没有构造函数的概念。因此,为了创建值,我创建了一个函数来写入正确的字段。在 Rust 中有不同的方法吗?
impl Entry {

fn new_int(value: i64, timestamp: i64, user_id: String) -> Entry {
//pub fn new(value: i64, timestamp: i64, user_id: String) -> Property {
Entry {
timestamp: timestamp,
value: Value::Int(value),
}
}

fn new_str(value: String, timestamp: i64, user_id: String) -> Entry {
Entry {
timestamp: timestamp,
value: Value::Str(value),
}
}
...
}

感谢您的帮助。

最佳答案

不要以 get/set 的方式思考方法(顺便说一句,这在 C++ 中也是个坏主意)。相反,操纵 enum直接,它允许您在一个步骤中提取类型和值:

match entry.value {
Value::Int (i) => process_int_value (i),
Value::Float (f) => process_float_value (f),
Value::Str (s) => process_string_value (s),
}

关于types - 强类型枚举作为 rust 中的联合 : How to determine type of value and retrieve it; How to do "constructors",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59145518/

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