E4211#
编译器诊断名称:control_in_list_comprehension。
在结果类型为 Iter 的列表推导式内部,不允许使用 return、break、continue,也不允许调用会产生错误的函数。
Iter 推导式是惰性的:它的主体会在之后迭代器被消费时才运行。会跳出外围函数或循环的控制流操作,以及需要立即传播错误的调用,都无法安全地跨越这个惰性边界。
错误示例#
fn values() -> Iter[Int] {
let xs : Iter[Int] = [ for _ in 0..<3 => { return Iter::empty() } ]
xs
}
建议#
让推导式主体保持为普通的产值表达式。如果需要提前退出,请使用急切求值的集合目标,或在消费迭代器时编写显式循环。
fn values() -> Iter[Int] {
[ for i in 0..<3 => i ]
}
test {
let mut sum = 0
values().each(x => sum = sum + x)
inspect(sum, content="3")
}