我可以在 Rust 中将结构嵌入到枚举中吗?

2023-12-26

我有这样的代码:

enum Packet {
    Quit,
    Message {
        text: String,
        time: i32,
        is_admin: bool,
    },
}

这很方便,但我不喜欢像这样的嵌套结构。想象一下,如果我需要此枚举中的更多项目,那么数据包定义将太大。 那么,有没有办法让我将 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是不相关(但嵌入)的类型。

但然后我必须做 let 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)
}

演示(不完整):

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以在 Rust 中将结构嵌入到枚举中吗? 的相关文章

随机推荐