例えば
val f1 = (a:Int) => a+1
def f2 = (a:Int) => a+1
それらはかなり互換性があるようですが、特定のものを使用する必要がある特定のユースケースはありますか?
例えば
val f1 = (a:Int) => a+1
def f2 = (a:Int) => a+1
それらはかなり互換性があるようですが、特定のものを使用する必要がある特定のユースケースはありますか?
通常、def
バージョンは次のように記述します。
def f2(a:Int) = a+1
あなたがしたように書くと、実際にはf2
、呼び出されたときに新しい関数クロージャを構築するメソッドが作成されます。したがって、どちらの場合でも、まだ機能があります。f1
しかし、最初のケースでは、関数は一度だけ構築され、後で使用するために(として) 格納されます。しかし、2 番目のケースでは、関数が参照されるたびに関数が構築されてしまいf2
、これは一種の無駄です。
では、どのような場合にメソッドよりも関数を優先するのでしょうか? 特定の状況では、関数をもう少し簡単に操作できます。このケースを考えてみましょう:
(1 to 3).map(f1 andThen f1) // totally fine
(1 to 3).map(f2 andThen f1) // "missing arguments" error
(1 to 3).map(f2 _ andThen f1) // fixed by adding "_" after the method name
常に関数なのでf1
、そのようなメソッドを呼び出すことができますandThen
。変数f2
はメソッドを表すため、このように使用されることは想定されていません。常に引数が続くことを期待しています。メソッドの後にアンダースコアを付けることで、いつでもメソッドを関数に変えることができますが、必要でない場合、これは少し見苦しくなります。