一个函数能否根据条件语句返回不同的类型?

7
我在想,是否有可能根据函数中的条件返回不同类型: 如果删除“|| bool”和“if / else”语句,该代码将正常工作。
提前感谢您。
fn main() {
    let vector: Vec<i32> = vec![0, 2, 5, 8, 9];
    let targetL i32 = 3;
    let found_item = linear_search(vector, target);
    println!("{}", &found_item);
}
fn linear_search(vector: Vec<i32>, target: i32) -> i32 || bool {
    let mut found: i32 = 0;
    for item in vector {
        if item == target {
            found = item;
            break
        }
    }
    if found == 0 {
        false
    } else {
        found
    }
}
1个回答

13

在编译时必须知道精确类型(随后擦除)。您不能在运行时任意决定返回哪些类型。

但是,您可以通过将类型包装到通用枚举中(取代代码中的||)来实现您尝试的操作:

enum TypeOr<S, T> {
    Left(S),
    Right(T),
}

fn linear_search(vector: ...) -> TypeOr<i32, bool> { //...

缺点是必须在对结果进行其他操作之前从枚举中获取值。然而,在实践中,这并不那么困难。
这本质上是通常使用的Option和Result类型的泛化版本。
编辑:事实上,在您的情况下,您可以通过Option类型的语义很好地解决问题:您永远不会返回true,因此您可以将None结果与函数返回的false结果相等同,并捕获您要表达的想法:要么您的线性搜索找到目标并将其返回(Some(found)),要么没有找到,没有任何东西可返回(None)。

谢谢你们两个,就这种情况而言,选项看起来更干净,但如果我理解正确:使用枚举,你有更多的选择。 - Ranj
7
在你的情况下,你应该明确使用Option。原始枚举有更多选项(并且可以嵌套等),但是Option位于标准库中,它的使用方式恰好符合你的用例。 - C. Quilley

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