E4105#
当前循环的结果类型与 break
参数的类型不匹配。
当提供给 break
语句的参数类型与循环的预期结果类型不匹配时,会发生此错误。在 MoonBit 中,循环可以有结果类型,当使用带有参数的 break
时,该参数的类型必须与循环的结果类型匹配。当没有提供参数时,循环的结果类型必须是 Unit
。
此不匹配可能发生在两种方式中:
循环期望一个特定类型的值,但
break
没有提供参数循环期望一个类型为 A 的值,但
break
提供了类型为 B 的参数
对于具有结果类型的循环,您必须确保:
所有
break
语句都提供正确类型的参数else
分支(如果存在)返回正确类型的值
错误示例#
pub fn g(x: Int) -> Int {
for i in 0..=x {
if i == 42 {
break
// ^^^^^ Error: Current loop has result type Int, but `break` is supplied
// with no arguments.
}
} else {
0
}
}
建议#
要修复此错误,您可以:
向
break
语句添加一个与循环结果类型匹配的参数。例如:
pub fn g(x: Int) -> Int {
for i in 0..=x {
if i == 42 {
break i
}
} else {
0
}
}
如果不需要从循环中返回值,请删除
else
分支。
pub fn g(x: Int) -> Unit {
for i in 0..=x {
if i == 42 {
break
}
}
}