gpt4 book ai didi

rust - 根据枚举是什么变体,如何返回其中的2种可能的类型之一?

转载 作者:行者123 更新时间:2023-12-03 11:45:35 25 4
gpt4 key购买 nike

之前已经多次问过类似的问题,但是最接近我的情况是here

我正在尝试实现这样的目标(尽管匹配部分完全错误)。

struct A {
a: i8,
b: u8,
}

struct B {
c: i16,
d: u16,
}

enum select {
type_a(A),
type_b(B),
}

impl select {
fn return_one<T>(&self) -> T {
match self {
type_a(a) => a,
type_b(b) => b,
}
}
}

如您所见,它有一个额外的警告,枚举内的值可以是两个结构之一。有什么我可以忽略的泛型魔术吗?也许我应该将类型与 std::mem::discriminant()进行比较?我将非常避免使用 Option<T>的2种方法。

最佳答案

我能够设计出可以满足您要求的东西,但我不建议这样做。

pub struct A {
a: i8,
b: u8,
}

pub struct B {
c: i16,
d: u16,
}

enum Select {
TypeA(A),
TypeB(B),
}

trait FromSelect {
fn from_select(sel: Select) -> Self;
}

impl FromSelect for A {
fn from_select(select: Select) -> Self {
match select {
Select::TypeA(a) => a,
_ => panic!("Tried to select B from A")
}
}
}

impl FromSelect for B {
fn from_select(select: Select) -> Self {
match select {
Select::TypeB(b) => b,
_ => panic!("Tried to select A from B")
}
}
}

impl Select {
fn return_one<T: FromSelect>(self) -> T {
FromSelect::from_select(self)
}
}

fn main() {

let s: Select = Select::TypeA(A { a: 5, b: 5 });

let _aa = s.return_one::<A>();

let s2: Select = Select::TypeA(A { a: 7, b: 7 });

// This Panics
let _bb = s2.return_one::<B>();

}

Playground

之所以说“种类”,是因为由于我不完全理解的原因,我无法定义不消耗 FromSelect枚举的 Select特征。

另外,您说过,您不希望使用两种不同的方法-我只能部分实现这一目标。在此解决方案中,定义了两种方法,但是调用方不需要知道这些方法,因为它们是使用泛型抽象出来的。

从主函数可以看到,您需要使用“turbofish”语法在编译时指定要获取的变体(或者您可以注释要放入的变量)-但是如果您错了,程序 panic 。更糟糕的是,编译器将无法警告您错误的提示!

对我而言,这抵消了您可能会获得的任何细微 yield 。最重要的是,还需要很多样板。

关于rust - 根据枚举是什么变体,如何返回其中的2种可能的类型之一?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61704402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com