[英]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.