簡體   English   中英

是否可以用另一個變體引用自身的枚舉變體?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM