19

私が最初に Scala を見始めたとき、for 内包表記の外観が気に入りました。これらは、私が Java 5 で慣れ親しんだ foreach ループに少し似ているように見えましたが、機能的な制限と多くの優れた構文があります。

しかし、Scala スタイルに慣れてきたので、for 補償を使用できるたびに、代わりにmap, flatMap, filter, reduceandを使用していることに気付きました。foreachそうすれば、コードの意図がより明確になり、潜在的な隠れた驚きが少なくなり、通常はコードも短くなります。

私の知る限り、for-comprehension は常にこれらのメソッドにコンパイルされているので、疑問に思っています: それらは実際には何のためにあるのでしょうか? 機能の再評価が欠けていますか (これは初めてではありません)。for-comprehensions は、他の機能ではできないことをしますか、または少なくともはるかに不器用になりますか? それらは特定のユースケースの下で際立っていますか? それは本当に個人的な好みの問題ですか?

4

5 に答える 5

15

この質問を参照してください。簡単な答えは、for 内包表記の方が読みやすいということです。特に、ネストされたジェネレーターが多数ある場合は、実際に行っていることの範囲がより明確になり、大きなインデントは必要ありません。

于 2009-09-07T01:27:19.867 に答える
12

for-comprehension のもう 1 つの優れた用途は、内部 DSL です。 ScalaQLはその好例です。これを回すことができます

val underAge = for { 
  p <- Person 
  c <- Company 
  if p.company is c 
  if p.age < 14 
} yield p 

これに

SELECT p.* FROM people p JOIN companies c ON p.company_id = c.id WHERE p.age < 14 

などなど。

于 2009-09-07T03:15:04.733 に答える
10

for-理解は構文糖衣ですが、それはそれらが重要ではないという意味ではありません。それらは通常、拡張された形式よりも簡潔です。これは素晴らしいことですが、おそらくもっと重要なことに、命令型言語のプログラマーが関数型構造を使用するのに役立ちます。

私が最初にScalaを始めたとき、私はよく理解していたので、理解のためによく使いました。それから、私はほとんど完全に停止しました。なぜなら、基礎となるメソッドを使用する方がより明確であり、したがってより明確であると感じたからです。今、私は内包表記の使用に戻っています。なぜなら、内包表記は、それを行う手段よりも、私が行っていることの意図をよりよく表現していると思うからです。

于 2009-09-06T16:29:34.357 に答える
5

場合によっては、内包表記の方が意図をより適切に表現できるため、そうである場合はそれらを使用します。

また、内包表記を使用すると、無料でパターン マッチングが得られることにも注意してください。たとえば、 Map の反復処理は、理解のために非常に簡単です。

for ((key, value) <- map) println (key + "-->" + value)

foreach よりも:

map foreach { case (key, value) => println (key + "-->" + value) }

于 2011-09-05T14:27:45.810 に答える
3

あなたが正しいです。理解のための糖衣構文です。基礎となる方法は、慣れれば、より簡潔で読みやすくなると思います。

次の同等のステートメントを比較してください。

1. for (i <- 1 to 100; if (i % 3 == 0)) yield Math.pow(i, 2)
2. (1 to 100).filter(_ % 3 == 0).map(Math.pow(_, 2))

私の意見では、#1にセミコロンを追加すると、これが単一の連鎖ステートメントであるという意味から注意がそらされます。また、iがvar(1、99、またはその中間)であるという感覚もあり、それ以外の機能的なスタイルを損なうことになります。

オプション2は、明らかにオブジェクトに対する一連のメソッド呼び出しです。チェーン内の各リンクは、その責任を明確に示しています。中間変数はありません。

おそらく、Javaから移行する開発者の便宜のために、理解のために含まれています。とにかく、どちらを選ぶかはスタイルと好みの問題です。

于 2009-09-06T23:09:44.037 に答える