3

参照/定義のこれら2つのアプローチの決定的な違いを理解しようとしていますFunction Literal(への参照anonymous function):

val

scala> val v2 = new Function[Int, Int] {
     | def apply(a: Int): Int = a + 1
     | }
v2: Int => Int = <function1>

そして、def

scala> def f2 = new Function[Int, Int] {
     | def apply(a: Int): Int = a + 1
     | }
f2: Int => Int

使用感としてはほぼ同じと思われます。引数として受け入れる関数にv2orを渡すことができます。その..に引数を渡すf2(Int) => Int

v2の場合、Function1オブジェクトを参照するオブジェクトを作成すると思いFunction1ます..のようにproxy

わかりました..私の質問は: 1 番目と 2 番目のアプローチの長所と短所は何ですか?

そして、それは によって定義されdefていますが、まだFunction Literalですか?

4

1 に答える 1

3

まず第一に、どちらの例も実際には関数リテラルFunctionではありません。昔ながらの無糖の方法でインスタンスを作成しています。実際、このアプローチ ( )を使用して Java コードからnew Function { ... }のインスタンスを作成できます。scala.Function

以下は両方とも関数リテラルであり、定義とまったく同じです。

val v2 = (a: Int) => a + 1
def f2 = (a: Int) => a + 1

ここでの唯一の実際の違いは、 はval何度使用v2しても (一度も使用しなくても) 単一のインスタンスを一度だけ作成するのに対し、defは毎回新しいインスタンスを作成する (またはまったく作成しない) ことです。使用しない場合)。したがって、通常はval.

ただし、 を使用する必要がある場合もありますdef。次の点を考慮してください。

def myIdentity[A] = (a: A) => a

これを として書く方法はありvalません。なぜなら、Scala にはこの意味での多相関数がないからです ( の任意のインスタンスに対してFunction[A, B]、具体的な型Aでなければなりません)。Bしかし、関数を返すポリモーフィック メソッドを定義することはできます。たとえば を記述するとmyIndentity(1)、 theAは であると推論され、期待どおりに をInt作成 (および適用) します。Function[Int, Int]

于 2014-03-03T02:34:54.693 に答える