[英]Is it possible to reference enum variant of itself with another variant?
是否可以通过 Rust 中相同枚举的另一个变体来引用枚举的变体?
一些虚构的代码:
enum Message{
Text(String),
Secret(Self::Text)
}
不幸的是,你不能。 Message
是一种类型,但Message::Text
不是,并且不能在使用类型的地方使用。
在这种情况下,简单的解决方案是让Secret
保存一个String
。 但是,假设您的实际用例有点复杂,一般策略是将其拉出到另一个结构中:
enum Message {
Text(MessageData),
Secret(MessageData),
}
struct MessageData {
foo: Bar,
// lots of other fields
}
对的,这是可能的! Box
类型可以包装其他类型,允许您拥有自引用类型。 这在链表等场景中是必需的。
我不相信您可以指定它包装特定的变体,所以这与您要求的略有不同。
这是一个隐藏秘密的例子!
use std::fmt;
enum Message {
Text(String),
Secret(Box<Self>)
}
impl fmt::Display for Message {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let contents = match self {
Message::Text(message) => message.to_string(),
Message::Secret(_) => "(hidden)".to_string(),
};
write!(f, "{}", contents)
}
}
fn main() {
let message = Message::Text("Hello world".to_string());
let secret = Message::Secret(Box::new(Message::Text("Don't read me!".to_string())));
println!("Message: {}", message);
println!("Secret: {}", secret);
}
这是使用相同代码的操场链接: https : //play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=292286f473550a38fd24924dfafe7bfe
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.