3

以下は同等です。

scala> val f1 = {i: Int => i == 1}
f1: Int => Boolean = <function1>

scala> val f2 = (i: Int) => i == 1
f2: Int => Boolean = <function1>

私は前者(Groovyから来ています)に精通していますが、後者の形式ははるかに一般的で、Scalaで関数を定義する標準的な方法であるAFAIKです。

過去(Groovy)を忘れて、2番目の形式を採用する必要がありますか?最初の形式は、クロージャ(関数)を定義するGroovy / Ruby / Javascriptの方法に似ているため、私にとってはより自然です。

編集このスレッド
のZeigerの回答を参照してください。たとえば、groovy / ruby​​ / javascriptのクロージャ構文は、両方を同じパフォーマンス、パスアラウンド機能などで交換可能に使用できると想定するよりも自然に見え、唯一の違いは構文です。{=>}() =>

4

2 に答える 2

2

これは好みの問題だと思います(scalaスタイルガイドが最初のものをお勧めします)。前者では、複数行(本文で> 2行)の関数を記述できます。

val f1 = { i: Int =>
  val j = i/2
  j == 1
}

時々それは役に立ちます

于 2012-04-30T15:53:36.793 に答える
2

実際には、両方のバージョンは「フル」バージョンの簡略化された形式です。

フルバージョン:複数のパラメーター、複数のステートメント。

scala> val f0 = { (x: Int, y: Int) => val rest = x % y; x / y + (if (rest > 0) 1 else 0) }
f0: (Int, Int) => Int = <function2>

「groovy」バージョン:1つのパラメーター、複数のステートメント。

scala> val f1 = { x: Int => val square = x * x; square + x }
f1: Int => Int = <function1>

「scala」バージョン:複数のパラメーター、1つのステートメント。

scala> val f2 = (x: Int, y: Int) => x * y
f2: (Int, Int) => Int = <function2>

構文的に有効ではないため(つまり、その文法が完全に機能しないため)、単一のパラメーターと単一のステートメントを持つバージョンは存在しません。

于 2012-04-30T19:39:40.990 に答える