2016-07-03 3 views
1

どのように私は機能が特徴であり、従って、定義されたと我々は機能にその形質のオブジェクトを宣言するたびにメソッドが作成されて適用されます知っていることから、機能f(i: Int, j:Int) = i + jextends Function2 [Int、Int]をスカラで拡張してオブジェクトを定義するためのユースケースは何ですか?

異なるオブジェクトsumを下回っています。しかし、私は以下のようなオブジェクト定義がどんな特別な目的を果たすことができるのか理解できません。

私が間違っている場合は、私に修正してください。

object sum extends Function2[Int, Int, Int]{ 
    def apply(first: Int, second: Int) = { 
     first + second 
    } 
    } 

答えて

1

これは値です。 fではなく、値に変換するだけで、複数の場所で使用されている場合は、複数回変換されるため、パフォーマンスに影響する可能性は非常に低くなります。しかし、私はval sum = (i: Int, j: Int) => i + j(またはそれがトップレベルにある必要がある場合、object A { val sum = (i: Int, j: Int) => i + j })に比べて利点がないと思います。

1

機能方法のカップルは、その関数リテラルがないているがあります。

  • 方法は、一般的なことができ、関数リテラルは、
  • 方法は、関数リテラルができ、暗黙のパラメータリストを持つことができますすることはできません
  • メソッドは、デフォルトの引数でオプションのパラメータを持つことができますが、関数リテラルはできません。
  • メソッドは繰り返しパラメータを持つことができます。

したがって、関数リテラル構文砂糖を使用する代わりにapplyメソッドを明示的に定義すると、これらのすべてにアクセスできます。

また、メソッドやフィールドを追加することもできます。

しかし、あなたの例ではこれらを使用していないので、実際には明示的な構文を使用しても意味がありません。

val sum = (first: Int, second: Int) => first + second 

sumであなたの例では、一方、それはobjectだ、valさ:

実は、違いがあります。あなたが投稿コードすることも

注:

def f(i: Int, j:Int) = i + j 

機能ではない、それは方法です!私の答えは、関数リテラルと明示的に定義されたインスタンス/サブタイプFunctionN,ではなく、メソッドへのの違いに適用されます。

+0

最初の段落で説明したことを使いたいのであれば、なぜ 'FunctionN'を拡張するのですか? 'apply'で任意のクラスを使わないのはなぜですか? –

+0

'FunctionN'が必要なものに渡したいからです。 'Seq.map'。 AFAIKでは、関数を期待するほとんどのメソッドは 'apply'(Ruby、Python、Javaと違って)の構造型の代わりに' FunctionN'にハードワイヤードされています。 –

+0

しかし、 'Seq.map'は、あなたのカスタム' apply'を期待しません(とにかく必須のものを定義しなければなりません)。 –

関連する問題