![](/img/trans.png)
[英]How can I use a Rust enum, struct, trait or anything else to construct a value containing an existential type?
[英]Can I embed struct into enum in Rust?
我有这样的代码:
enum Packet {
Quit,
Message {
text: String,
time: i32,
is_admin: bool,
},
}
这很方便,但我不喜欢这样的嵌套结构。 想象一下,如果我在这个枚举中需要更多的项目,那么 Packet 定义就会太大。 那么,有没有办法让我把 Message 结构移到外面,然后在 Packet 结构的定义中写下它的名字? 我想过做这样的事情:
struct ChatMessage {
text: String,
time: i32,
is_admin: bool,
}
enum Packet {
Quit,
Message(ChatMessage),
}
(顺便说一句,我可以将结构命名为与 Packet 中的项目相同( struct Message
, Message(Message)
)吗?)
但后来我不得不let msg = message.0
或类似的东西。 如果这是唯一的解决方案 - 我可以接受,但如果有更简洁的解决方案,我会很高兴。
这很方便,但我不喜欢这样的嵌套结构。
它不是嵌套结构,而是类似结构的变体。
那么,有没有办法让我把 Message 结构移到外面,然后在 Packet 结构的定义中写下它的名字? 我想过做这样的事情:
您完全可以这样做,它按原样工作,这是一种非常常见的模式。
(顺便说一句,我可以将结构命名为与数据包(结构消息,消息(消息))中的项目相同吗?)
是的,两者之间实际上没有关系: Packet::Message
是Packet
枚举的构造函数,而Message
是不相关(但嵌入)的类型。
但后来我不得不让 msg = message.0 或类似的东西。
是也不是,枚举需要某种模式匹配,因此在所有情况下,您都必须匹配您的Packet
变体。 在第一个版本中,您可以直接提取变体的字段:
match packet {
Quit => todo!("something"),
Message { text, .. } => todo!("something with {}", text)
}
而第二个您提取Message
,并从那里提取其内容:
match packet {
Quit => todo!("something"),
Message(m) => todo!("something with {}", m.text)
}
然而,模式实际上具有无限的“深度”,所以你可以同时做这两个都很好,只是有点冗长:
match packet {
Quit => todo!("something"),
Message(ChatMessage { text, .. }) => todo!("something with {}", text)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.