【问题标题】:Can a function return different types depending on conditional statements in the function?函数能否根据函数中的条件语句返回不同的类型?
【发布时间】:2016-01-28 04:30:22
【问题描述】:

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

【问题讨论】:

    标签: types rust linear-search


    【解决方案1】:

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

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

    enum TypeOr<S, T> {
        Left(S),
        Right(T),
    }
    
    fn linear_search(vector: ...) -> TypeOr<i32, bool> { //...
    

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

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

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

    【讨论】:

    • 谢谢你们,在这种情况下,选项看起来更干净,但如果我理解正确:使用枚举,你有更多选择
    • @user3419211 在您的情况下,您绝对应该使用Option。原始枚举有更多选项(并且可以嵌套等),但 Option 在标准库中,它的使用与您的用例完全匹配。
    猜你喜欢
    • 2019-05-07
    • 2012-04-08
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    • 1970-01-01
    相关资源
    最近更新 更多