簡體   English   中英

創建類型的通用變體的枚舉

[英]Create enum of generic variants of a type

我有一個帶有常量泛型參數VAR的結構。 該參數用於方法中,提高運行時速度,由於大量比較可以在編譯時完成。 在任何地方存儲和傳遞泛型類型是相當困難的。 我有固定數量的變體,我可以在枚舉SquirrelVariant中列出,我可以更輕松地傳遞,並使用match分支到泛型函數。 Squirrel<VAR>創建枚舉相當困難,rust 似乎不允許編譯時match或類似的東西。

struct Squirrel<const VAR: u8>
{
}


enum SquirrelVariant
{
    V1(Squirrel<1>),
    V2(Squirrel<2>),
    V3(Squirrel<3>),
}

// failed attempt 1)
fn make_squirrel_variant<const VAR: u8>(s: Squirrel<VAR>) -> SquirrelVariant
{
    match VAR {
        1 => SquirrelVariant::V1(s), // expected `1_u8`, found `VAR`
        2 => SquirrelVariant::V2(s), // expected `2_u8`, found `VAR`
        3 => SquirrelVariant::V3(s), // expected `3_u8`, found `VAR`
    }
}


// failed attempt 2)
impl From<Squirrel<1>> for SquirrelVariant
{
    fn from(s: Squirrel<1>) -> Self
    {
        SquirrelVariant::V1(s)
    }
}

impl From<Squirrel<2>> for SquirrelVariant
{
    fn from(s: Squirrel<2>) -> Self
    {
        SquirrelVariant::V2(s)
    }
}

impl From<Squirrel<3>> for SquirrelVariant
{
    fn from(s: Squirrel<3>) -> Self
    {
        SquirrelVariant::V3(s)
    }
}

fn make_squirrel_variant2<const VAR: u8>(s: Squirrel<VAR>) -> SquirrelVariant
{
    s.into() // the trait `From<Squirrel<VAR>>` is not implemented for `SquirrelVariant`
    // = help: the following implementations were found:
    //     <SquirrelVariant as From<Squirrel<1_u8>>>
    //     <SquirrelVariant as From<Squirrel<2_u8>>>
    //     <SquirrelVariant as From<Squirrel<3_u8>>>
}

https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=54ec536a9d84d13b4b3ae16180022ba8

您可以使用以下技巧來解決類型錯誤:

struct Squirrel<const VAR: u8> {}

impl<const VAR: u8> Squirrel<VAR> {
    fn transmute_squirrel_type<const VAR2: u8>(self) -> Squirrel<VAR2> {
        if VAR == VAR2 {
            Squirrel { }
        } else {
            unreachable!()
        }
    }
}


enum SquirrelVariant
{
    V1(Squirrel<1>),
    V2(Squirrel<2>),
    V3(Squirrel<3>),
}

impl<const VAR: u8> Squirrel<VAR> {
    fn to_variant(self) -> SquirrelVariant {
        match VAR {
            1 => SquirrelVariant::V1(self.transmute_squirrel_type()),
            2 => SquirrelVariant::V2(self.transmute_squirrel_type()),
            3 => SquirrelVariant::V3(self.transmute_squirrel_type()),
            _ => unreachable!()
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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