繁体   English   中英

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

[英]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 MessageMessage(Message) )吗?)
但后来我不得不let msg = message.0或类似的东西。 如果这是唯一的解决方案 - 我可以接受,但如果有更简洁的解决方案,我会很高兴。

这很方便,但我不喜欢这样的嵌套结构。

它不是嵌套结构,而是类似结构的变体。

那么,有没有办法让我把 Message 结构移到外面,然后在 Packet 结构的定义中写下它的名字? 我想过做这样的事情:

您完全可以这样做,它按原样工作,这是一种非常常见的模式。

(顺便说一句,我可以将结构命名为与数据包(结构消息,消息(消息))中的项目相同吗?)

是的,两者之间实际上没有关系: Packet::MessagePacket枚举的构造函数,而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)
}

演示(不完整): https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=b2bdaf08c45424f507955790445cc2f9

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM