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