我有一个函数,它返回两个依赖于某些逻辑的结构之一。我需要指定返回类型为两个之一。我该怎么做呢?
struct A {}struct B {}fn picky() -> ??? { let a = A{}; let b = B{}; if 1 < 10 { a } else { b }}fn main() { picky();}
struct A {}
struct B {}
fn picky() -> ??? {
let a = A{};
let b = B{};
if 1 < 10 {
a
} else {
b
}
fn main() {
picky();
这感觉应该是微不足道的,但在谷歌上几个小时后,我仍然无法弄清楚。
xzlaal3s1#
你的函数只有一个返回类型,但这个类型可能是enum:
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) }}
enum AB {
A(A),
B(B),
fn picky() -> AB {
AB::A(a)
AB::B(b)
这正是Result在Rust中的工作方式:你要么得到想要的值,要么得到一个错误,因为结果是一个有两个变量的枚举。
Result
r55awzrz2#
如果你想这样做,结构可能有一些共同之处。在这种情况下,我认为最好像这样返回一个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();}
trait TraitForAandB {}
impl TraitForAandB for A {}
impl TraitForAandB for B {}
fn picky() -> Box<dyn TraitForAandB> {
Box::new(a)
Box::new(b)
Playground是here。
2条答案
按热度按时间xzlaal3s1#
你的函数只有一个返回类型,但这个类型可能是enum:
这正是
Result
在Rust中的工作方式:你要么得到想要的值,要么得到一个错误,因为结果是一个有两个变量的枚举。r55awzrz2#
如果你想这样做,结构可能有一些共同之处。
在这种情况下,我认为最好像这样返回一个Boxed trait:
Playground是here。