Rust:如何指定可能的返回类型之一?

3

我有一个函数,根据某些逻辑返回两个结构体中的一个。我需要指定返回类型为其中之一。我该怎么做?

struct A {}

struct B {}

fn picky() -> ??? {
    let a = A{};
    let b = B{};
    if 1 < 10 {
        a
    } else {
        b
    }
}

fn main() {
    picky();
}

这似乎应该是微不足道的事情,但是在Google上搜索了几个小时后,我仍然无法弄清楚。我是Rust的新手。

2个回答

8

你的函数只有一种返回类型,但这种类型可能是一个枚举类型

struct A {}
struct B {}

enum AB {
    A(A),
    B(B),
}

fn picky() -> AB {
    let a = A{};
    let b = B{};
    if 1 < 10 {
        AB::A(a)
    } else {
        AB::B(b)
    }
}

这正是Rust中Result的工作原理:由于结果是一个有两个变体的枚举,所以你要么得到期望的值,要么得到一个错误。

如果两者之一可以被视为正常返回,而另一个是异常/错误返回,您可以滥用Result<A, B>作为返回类型。还有一个提供了Either类型的 crate,其中两种类型都处于平等地位。如果不确定使用什么,请按照此答案中所示创建自己的枚举类型。 - user4815162342

0
如果你想要这样做,那么结构体可能有一些共同点。
在这种情况下,我认为最好返回一个Boxed trait,像这样:
trait TraitForAandB {}

struct A {}
impl TraitForAandB for A {}

struct B {}
impl TraitForAandB for B {}

fn picky() -> Box<dyn TraitForAandB> {
    let a = A{};
    let b = B{};
    if 1 < 10 {
        Box::new(a)
    } else {
        Box::new(b)
    }
}

fn main() {
    picky();
}

游乐场在此处


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接