我有一個帶有常量泛型引數的結構VAR。該引數用于方法中,提高運行時速度,由于大量比較可以在編譯時完成。在任何地方存盤和傳遞泛型型別是相當困難的。我有固定數量的變體,我可以在 enum 中列出SquirrelVariant,我可以更輕松地傳遞,并用于match分支到通用函式。從 a 創建列舉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
uj5u.com熱心網友回復:
您可以使用以下技巧來解決型別錯誤:
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!()
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/495742.html
上一篇:泛型中的約束型別
