从内部返回for循环导致类型不匹配

时间:2016-12-22 17:42:45

标签: rust type-mismatch

我试图从位于结构for中的函数返回一个位于impl循环内的函数指针。

fn locate_func(&self, string: &str) -> fn() -> bool {
    let mut func;

    for alt in &self.alts {
        return alt.func;
    }
}

将来if循环中会有一个for语句,但是当我正在测试时,它看起来很通用,而且有点不合逻辑。

上面的代码在我的脑海中,应该返回指向alt.func()的指针,它显然是一个指针,因为它告诉我所以我应该删除该行的返回和分号。

error[E0308]: mismatched types
  --> src\main.rs:42:3
   |
42 |            for alt in &self.alts
   |            ^ expected fn pointer, found ()
   |
   = note: expected type `fn() -> bool`
   = note:    found type `()`

以上是运行locate_func()时导致的错误。由于上述代码无法正常工作,我显然遗漏了一些东西。任何提示?

1 个答案:

答案 0 :(得分:5)

您的for - 循环是函数内的最后一个表达式。编译器期望最后的表达式计算为返回类型。但是所有循环都计算为()单位 void ),因此编译器在那里有经典的类型不匹配。

要问自己的正确问题是:如果循环中的return不会被执行会发生什么(例如,因为循环根本没有被执行,因为self.alts是空的)?这会导致问题,不是吗?

所以你必须在 for - 循环之后返回一个有效的对象以涵盖这种情况。 但是如果您确定永远不会达到循环后的点,您可以使用unreachable!();告诉编译器您已经知道的内容。但是,如果该计划将达到这个位置,它将会恐慌!所以最好确保,你肯定知道程序的行为方式。