私はscalaを学ぼうとしており、以下が合法である理由を理解しようとしています:
for (idx <- 1 to 10) yield idx
しかし、以下は合法ではありません。
for (idx <- 1 to 10) { yield idx }
それらは構文的に同じように見えます。私は何が欠けていますか?
前もって感謝します。
私はscalaを学ぼうとしており、以下が合法である理由を理解しようとしています:
for (idx <- 1 to 10) yield idx
しかし、以下は合法ではありません。
for (idx <- 1 to 10) { yield idx }
それらは構文的に同じように見えます。私は何が欠けていますか?
前もって感謝します。
これがパーサーの動作方法であるため、Scala 仕様の一部を以下に示します。
Expr1 ::= ‘for’ (‘(’ Enumerators ‘)’ | ‘{’ Enumerators ‘}’)
{nl} [‘yield’] Expr
1つまたは複数のその名前の列挙子を使用できると書かれており、次のよう{nl}
に複数の をネストできると書かれていますfor
for(...)
for(...)
...
yield
オプションのキーワードの後に式を追加できますが、中かっこの場所はありません。式 (本文) 自体は、 、 、またはその他の何かにすることができる(idx)
ため{idx}
、idx
これは合法です。
for (idx <- 1 to 10) yield { idx }
これは、for 式がどのように de-sugared されるか (およびそれに関連するパーサー規則) に帰着します。
最初のケースでは、コンパイラは内包表記を次のように de-sugar します。
(1 to 10).map(idx => idx)
2 番目のケースは、for ループを使用できるようにする省略形です (これは潜在的に面倒です)。の 2 番目の形式は、for
本質的foreach
に、結果が常に存在する場所で実行されるUnit
ためyield
、戻り値の型が既に定義されているため、実行できません。
yield
で代用できるようmap
です。したがって、これを可能にする
for (idx <- 1 to 10) yield {val square = idx * idx; square}
詳細については、scala-yield-syntaxを参照してください。詳細については、can-someone-explain-scalas-yield を参照してください。