首页 > 解决方案 > 如何根据传入的枚举值使结构实例具有不同类型的字段?

问题描述

我想为结构创建不同的“风味”。这意味着根据我传递给结构的构造函数的枚举,我将获得一个结构版本,其“风味”特征的类型取决于该枚举值。我知道我必须为结构的字段指定单一类型,但是如果我希望根据传递给构造函数的值更改该类型怎么办?我只能使用特征做这样的事情吗?

pub struct ChocolateFlavor {
    coco: u32,
}

pub struct VanillaFlavor {
    bean: u32,
}

pub struct IceCream {
    flavor: (), //should be able to be ChocholateFlavor or VanillaFlavor
}

pub enum Flavors {
    Vanilla,
    Chocholate,
}

impl IceCream {
    pub fn new(input_type: Flavors) -> Self {
        match input_type {
            Flavors::Vanilla => input = VanillaFlavor,
            Flavors::Chocholate => input = ChocolateFlavor,
        }
        let mut new_icecream = LabeledInput { flavor: input };
        new_icecream
    }
}

fn main() {
    //give me a chocholate ice cream
    let mut my_chocholate = IceCream::new(Flavors::Chocolate);
    //give me a vanilla ice cream
    let mut my_vanilla = IceCream::new(Flavors::Vanilla);
}

标签: rust

解决方案


您可以使用带有值的枚举

enum FlavorData {
    ChocolateFlavor { coco: u32 },
    VanillaFlavor { bean: u32 },
}

pub struct IceCream {
    flavor: FlavorData,
}

pub enum Flavors {
    Vanilla,
    Chocolate,
}

impl IceCream {
    pub fn new(input_type: Flavors) -> Self {
        let flavor = match input_type {
            Flavors::Vanilla => FlavorData::VanillaFlavor { bean: 10 },
            Flavors::Chocolate => FlavorData::ChocolateFlavor { coco: 20 },
        };
        IceCream { flavor: flavor }
    }
}

fn main() {
    //give me a chocholate ice cream
    let mut my_chocolate = IceCream::new(Flavors::Chocolate);
    //give me a vanilla ice cream
    let mut my_vanilla = IceCream::new(Flavors::Vanilla);
}

推荐阅读