3

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

1 回答 1

6

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

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

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

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

缺点是您必须先从枚举中解包值,然后才能对结果执行任何其他操作。然而,这在实践中并不是那么困难。

这本质上是常用OptionResult类型的通用版本。

编辑:事实上,在您的情况下,Option类型的语义为您提供了非常好的服务:您永远不会 return ,因此您可以将结果与函数返回的结果true等同起来,这抓住了您试图表达的想法:您的线性搜索要么找到目标并返回它(),要么没有,并且没有任何东西可返回()。NonefalseSome(found)None

于 2015-10-28T12:00:11.827 回答