作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
类型化的社区,
来自 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>
}
impl Entry {
pub fn get_i64(&self) -> Option<i64> {
match &self.value {
Value::Int(i) => Some(*i),
_ => None
}
}
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/
我是一名优秀的程序员,十分优秀!