【问题标题】:How do I implement a trait for an enum and its respective variants?如何为枚举及其各自的变体实现特征?
【发布时间】:2019-11-25 17:36:50
【问题描述】:

我正在尝试使用枚举变体来捕获本质上是异构的数据(具有不同的字段集合),但从协议的角度来看,这些数据具有相同的“类型”。但是,我不确定如何实现特定于子类型的方法和特征。这是一个关于如何创建数据枚举的最小示例,并且我可以使用枚举变体构造函数来指定类型,但是如果我在变体上实现特征,则调用该函数不是我想出的方法.

use std::fmt;

enum Data {
    N(NData),
    S(SData),
}

struct NData {
    numeric: u32,
}

impl fmt::Display for NData {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "{}", self.numeric)
    }
}

struct SData {
    stringy: Vec<String>,
}

fn main() {
    let d_n: Data = Data::N(NData { numeric: 0x0 });
    let n = NData { numeric: 0xff };

    // Fails, fmt::Display not implemented for Data
    println!("{}", d_n);

    // Just fine!
    println!("{}", n);
}

【问题讨论】:

  • 请注意,您可能只想派生Debug trait
  • @Stargateur:如果这就是我真正要做的,当然!但这是对我需要实现的实际特征的代表性简化。

标签: enums rust


【解决方案1】:

一种可能的解决方案是为变体以及enum 实现您的特征,正如您在此处看到的,它仅调用变体的特定实现:

use std::fmt;

struct NData {
    numeric: u32,
}

impl fmt::Display for NData {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "{}", self.numeric)
    }
}

struct SData {
    strings: Vec<String>,
}

impl fmt::Display for SData {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "{:?}", self.strings)
    }
}

enum Data {
    N(NData),
    S(SData),
}

impl fmt::Display for Data {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        match self {
            Data::N(n_data) => n_data.fmt(f),
            Data::S(s_data) => s_data.fmt(f),
        }
    }
}

fn main() {
    let n = NData { numeric: 0xff };
    let s = SData { strings: vec!["hello".to_string(), "world".to_string()] };

    println!("{}", n);
    println!("{}", s);

    let d_n = Data::N(n);
    let d_s = Data::S(s);

    println!("{}", d_n);
    println!("{}", d_s);
}

这将产生以下输出:

255
["hello", "world"]
255
["hello", "world"]

【讨论】:

  • 谢谢!我几乎找到了这个匹配解决方案,但没有正确的一些细节。完美答案!
猜你喜欢
  • 2019-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多