不匹配的类型。预计i32,发现()

时间:2016-09-16 00:36:50

标签: types rust

此代码:

fn ackermann(m: i32, n: i32) -> i32 {
    if m == 0 {
        return n + 1;
    } else if m > 0 && n == 0 {
        return ackermann(m - 1, 1);
    } else if m > 0 && n > 0 {
        return ackermann(m - 1, ackermann(m, n - 1));
    }
}

编译时出错:

error: mismatched types [--explain E0308]
 --> src/main.rs:3:5
  |>
3 |>     if m == 0 {
  |>     ^ expected i32, found ()
note: expected type `i32`
note:    found type `()`

1 个答案:

答案 0 :(得分:8)

并非所有代码路径都返回值。你可以通过几种方式解决这个问题..但是因为这似乎是一个递归函数..你可能想要一种方法来打破递归:

fn ackermann(m: i32, n: i32) -> i32 {
    if m == 0 {
        return n + 1;
    } else if m > 0 && n == 0 {
        return ackermann(m - 1, 1);
    } else if m > 0 && n > 0 {
        return ackermann(m - 1, ackermann(m, n - 1));
    }

    return 0; // This breaks your recursion
}

或者,也许是明确的else

if m == 0 {
    return n + 1;
} else if m > 0 && n == 0 {
    return ackermann(m - 1, 1);
} else if m > 0 && n > 0 {
    return ackermann(m - 1, ackermann(m, n - 1));
} else { // An explicit else also works
    return 0;
}

我没有太多考虑这个算法是什么/做什么..但错误很清楚。如何打破递归并让函数返回实际值取决于您。

编辑:本杰明在评论中指出,这个特定的功能实际上不应该超出你提供的条件。因此,其他一些选项包括如果代码确实消失或者可能返回Result<i32>而发生恐慌。

TLDR是:如果你的条件都没有满足..那么当函数预期返回一个数字时,函数不会返回任何内容。