这很方便,但我不喜欢像这样的嵌套结构。
它不是嵌套结构,而是类似结构的变体。
那么,有没有办法让我将 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)
}
演示(不完整):