0

私はscalaを学ぼうとしており、以下が合法である理由を理解しようとしています:

for (idx <- 1 to 10) yield idx

しかし、以下は合法ではありません。

for (idx <- 1 to 10) { yield idx }

それらは構文的に同じように見えます。私は何が欠けていますか?

前もって感謝します。

4

3 に答える 3

9

これがパーサーの動作方法であるため、Scala 仕様の一部を以下に示します。

Expr1 ::= ‘for’ (‘(’ Enumerators ‘)’ | ‘{’ Enumerators ‘}’)
  {nl} [‘yield’] Expr

1つまたは複数のその名前の列挙子を使用できると書かれており、次のよう{nl}に複数の をネストできると書かれていますfor

for(...)
  for(...) 
    ...

yieldオプションのキーワードの後に​​式を追加できますが、中かっこの場所はありません。式 (本文) 自体は、 、 、またはその他の何かにすることができる(idx)ため{idx}idxこれは合法です。

for (idx <- 1 to 10) yield { idx }
于 2013-02-20T06:55:14.190 に答える
1

これは、for 式がどのように de-sugared されるか (およびそれに関連するパーサー規則) に帰着します。

最初のケースでは、コンパイラは内包表記を次のように de-sugar します。

(1 to 10).map(idx => idx)

2 番目のケースは、for ループを使用できるようにする省略形です (これは潜在的に面倒です)。の 2 番目の形式は、for本質的foreachに、結果が常に存在する場所で実行されるUnitためyield、戻り値の型が既に定義されているため、実行できません。

于 2013-02-20T06:57:22.673 に答える
1

yieldで代用できるようmapです。したがって、これを可能にする

for (idx <- 1 to 10) yield {val square = idx * idx; square}

詳細については、scala-yield-syntaxを参照してください。詳細については、can-someone-explain-scalas-yield を参照してください。

于 2013-02-20T08:09:14.100 に答える