同じ関数を表現する3つの方法を考えますf(a) := a + 1
。
val f1 = (a:Int) => a + 1
def f2 = (a:Int) => a + 1
def f3:(Int => Int) = a => a + 1
これらの定義はどのように異なりますか?REPLは明らかな違いを示していません。
scala> f1
res38: (Int) => Int = <function1>
scala> f2
res39: (Int) => Int = <function1>
scala> f3
res40: (Int) => Int = <function1>
valバージョンが新しい関数インスタンスを必要としない場合、@ RandallSchulzは、なぜこの場合にdefを使用するのでしょうか?
—
virtualeyes 2012年
@virtualeyes FunctionN [...]値を生成するdefが見られる場所を思い出すことができる唯一の状況は、コンビネーターパーサーライブラリにあります。関数を生成するメソッドを作成することはあまり一般的ではなく、defを使用して意味的/機能的に変化しない関数の多くのコピーを生成することはほとんどありません。
—
Randall Schulz
f1
では、REPL で評価すると、静的にバインドされた値が表示され、それらのメソッドを呼び出した結果f1
を評価f2
してf3
表示することに注意してください。特に、新しいインスタンスが生成されるか、呼び出されるたびに、いつまでも同じです。Function1[Int, Int]
f2
f3
f1
Function1[Int, Int]