繁体   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