3

例えば

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

それらはかなり互換性があるようですが、特定のものを使用する必要がある特定のユースケースはありますか?

4

1 に答える 1

4

通常、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はメソッドを表すため、このように使用されることは想定されていません。常に引数が続くことを期待しています。メソッドの後にアンダースコアを付けることで、いつでもメソッドを関数に変えることができますが、必要でない場合、これは少し見苦しくなります。

于 2012-09-21T04:27:03.070 に答える