E4211

E4211#

编译器诊断名称:control_in_list_comprehension

在结果类型为 Iter 的列表推导式内部,不允许使用 returnbreakcontinue,也不允许调用会产生错误的函数。

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")
}