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