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

Rust 从for循环内部返回会导致类型不匹配,rust,type-mismatch,Rust,Type Mismatch,我试图从结构的impl中的函数返回for循环中的函数指针 fn locate_func(&self, string: &str) -> fn() -> bool { let mut func; for alt in &self.alts { return alt.func; } } 在将来的for循环中会有一个if语句,但是由于我正在测试一些东西,它看起来相当通用,而且有些不合逻辑 在我看来,上面的代码应该返回指向a

我试图从结构的
impl
中的函数返回
for
循环中的函数指针

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

    for alt in &self.alts {
        return alt.func;
    }
}
在将来的
for
循环中会有一个
if
语句,但是由于我正在测试一些东西,它看起来相当通用,而且有些不合逻辑

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

错误[E0308]:类型不匹配
-->src\main.rs:42:3
|
42 |对于alt in和self.alts
|^应为fn指针,找到()
|
=注意:应为'fn()->bool类型`
=注意:找到类型“()`

以上是运行
locate\u func()
时导致的错误。我显然遗漏了一些东西,因为前面提到的代码工作不正常。有什么提示吗?

您的
for
-循环是函数中的最后一个表达式。编译器希望最后一个表达式的计算结果为返回类型。但是所有循环的计算结果都是
()
(unit或void),因此编译器存在典型的类型不匹配

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


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

如果
self.alts
为空,您将返回什么?它肯定不是空的。但这在代码方面是一个很好的观点。位于结构impl中的函数-这些被称为方法。是的,这是有意义的。感谢您指出这一点。在最初的情况下,如果循环中有一个
if
,我建议使用类似
self.alts.iter().find(…).expect(“必须有一个funct”)