Types rust中作为联合的强类型枚举:如何确定值的类型并检索它;“怎么做?”;建造商;
类型化社区, 来自C++的我正在寻找一个解决方案来在锈中的结构中存储不同类型的值。 总体思路是将优先级队列存储在Hashmap中,并按队列名称索引,允许添加条目并按时间戳排序。这些条目应该能够保存以前定义类型的值字段。 用例能够对值进行版本控制,并在需要时通过附加字段对值进行注释 <>在C++中,我将通过继承从一个定义的接口和一个存储指向该结构的指针的列表,或通过一个空指针和类型指示枚举字段。 到目前为止,我发现Rust使用了一个类型化的枚举。我的问题是“类型化”如何工作(我理解,在内存中,实际上可能有一个不同的生锈范例,而不是C++,因为C++中的方法需要RTTI或类型转换)。 在生锈的情况下,正确的方法是什么Types rust中作为联合的强类型枚举:如何确定值的类型并检索它;“怎么做?”;建造商;,types,enums,constructor,rust,Types,Enums,Constructor,Rust,类型化社区, 来自C++的我正在寻找一个解决方案来在锈中的结构中存储不同类型的值。 总体思路是将优先级队列存储在Hashmap中,并按队列名称索引,允许添加条目并按时间戳排序。这些条目应该能够保存以前定义类型的值字段。 用例能够对值进行版本控制,并在需要时通过附加字段对值进行注释 在C++中,我将通过继承从一个定义的接口和一个存储指向该结构的指针的列表,或通过一个空指针和类型指示枚举字段。 到目前为止,我发现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),
}
}
...
}
例如:
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
}
}
谢谢您的帮助。
< P>不要用<代码> 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),
}
<>不要用<代码> 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),
}
是的,就像@Jmb的回答和我的评论一样,我不太清楚你为什么需要进行打字 <> P>但是,如果您需要对所有数据类型进行一些共同操作,我建议创建一个特性(应该是C++接口的替代)。
使用std::collections::LinkedList;
使用std::fmt::Display;
#[导出(调试)]
结构值{
时间戳:i64,
值:T,
}
性状输入{
fn打印输出(&self);
fn get_timestamp(&self)->i64;
}
值的impl条目{
fn打印输出(&self){
println!(“{}”,self.value);
}
fn get_时间戳(&self)->i64{
自我时间戳
}
}
结构版本列表{
名称:String,
条目:LinkedList
}
impl版本列表{
pub fn new()->Self{
版本列表{name:“test”.to_owned(),条目:LinkedList:::new()}
}
pub fn put是的,就像@Jmb的回答和我的评论一样,我不太清楚你为什么需要进行打字
<> P>但是,如果您需要对所有数据类型进行一些共同操作,我建议创建一个特性(应该是C++接口的替代)。
使用std::collections::LinkedList;
使用std::fmt::Display;
#[导出(调试)]
结构值{
时间戳:i64,
值:T,
}
性状输入{
fn打印输出(&self);
fn get_timestamp(&self)->i64;
}
值的impl条目{
fn打印输出(&self){
println!(“{}”,self.value);
}
fn get_时间戳(&self)->i64{
自我时间戳
}
}
结构版本列表{
名称:String,
条目:LinkedList
}
impl版本列表{
pub fn new()->Self{
版本列表{name:“test”.to_owned(),条目:LinkedList:::new()}
}
PUB FN PATTO如果不知道该值的类型,并且如果你不知道它的类型,你会用它来提取列表的值吗?我不太理解你的问题。所以,如果在C++中,你在知道值之前知道类型吗?如果是这样,你仍然需要像<代码>(type = =“i64”){{dooiix64 op-())的代码;}否则(如果类型=“f64”){do_f64_op();}else{do_else()}
,因此您可以定义一个类似于impl Entry{fn get_value(&self)->value{self.value}
,并且在使用它时,匹配值{…}如果不知道该值的类型,如果你不知道它的类型,那么就要提取列表的值,如果你不知道这个问题,我不太理解你的问题。所以如果在C++中,你在知道值之前知道类型吗?如果是这样,你仍然需要像<代码>(类型= =“i64”)的代码{doiiix4op-();否则,如果(type=“f64”){do_f64_op();}else{do_else()}
,因此您可以定义一个类似于impl Entry{fn get_value(&self)->value{self.value}
,并且当您使用它时,匹配值{…}