函数可以根据函数中的条件语句返回不同的类型吗?

use*_*211 2 types rust linear-search

我想知道是否可以根据函数中的条件返回不同的类型:如果删除'||,此代码将起作用 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
    }
}
Run Code Online (Sandbox Code Playgroud)

C. *_*ley 5

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

但是,您可以尝试将类型包装到通用枚举中(替换||代码中):

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

fn linear_search(vector: ...) -> TypeOr<i32, bool> { //...
Run Code Online (Sandbox Code Playgroud)

缺点是您必须先从枚举中解开值,然后才能对结果执行任何其他操作.但是,这在实践中并不是那么艰巨.

这基本上是常用OptionResult类型的通用版本.

编辑:事实上,在你的情况下,你通过Option类型的语义非常好地服务:你永远不会返回true,所以你可以将None结果等同于false你的函数返回的结果,这捕获了你想要表达的想法:您的线性搜索找到目标并返回它(Some(found)),或者它没有,并且没有任何返回(None).

  • @ user3419211在你的情况下,你一定要使用`Option`.原始枚举有更多选项(并且可以嵌套等),但是`Option`在标准库中,并且它的使用完全匹配您的用例. (4认同)