web-dev-qa-db-ja.com

Scalaのapply()メソッドの魔法はどのように機能しますか?

Scalaでは、クラスまたはトップレベルオブジェクトでapplyというメソッドを定義すると、そのクラスのインスタンスにかっこを追加し、適切な引数を設定するたびにそのメソッドが呼び出されますapply()はそれらの間にあります。例えば:

_class Foo(x: Int) {
    def apply(y: Int) = {
        x*x + y*y
    }
}

val f = new Foo(3)
f(4)   // returns 25
_

したがって、基本的に、object(args)object.apply(args)の単なる構文上の砂糖です。

Scalaこの変換はどのように行われますか?

Predefオブジェクトでの暗黙的な型変換に似た、グローバルに定義された暗黙的な変換がありますか?それとも、もっと深い魔法ですか? Scalaは、多くの例外を伴う多くのルールよりも、より小さなルールのセットの一貫した適用を強く支持しているように思えます。これは、最初は私にとって例外のようです。

79
Jeff

あなたが最初に言ったことよりも深いことは何もないと思います:それは単なる特別な構文のケースとして、コンパイラがf(a)f.apply(a)に変換する単なる構文上の砂糖です。

これは特定のルールのように思えるかもしれませんが、これらのほんの一部(たとえば、updateを使用する)でしか、 [〜#〜] dsl [〜#〜] -のような構造とライブラリ。

66
oxbow_lakes

実際には別の方法です。適用メソッドを持つオブジェクトまたはクラスは通常の場合であり、関数は適用メソッドを持つ同じ名前のオブジェクトを暗黙的に構築する方法です。実際に定義するすべての関数は、Functionのサブオブジェクトですn 特性(nは引数の数)。

トピックの詳細については、 Scala Language Specification のセクション6.6:Function Applicationsを参照してください。

20
sebasgo

Scalaは、多くの例外を伴う多くのルールよりも、より小さなルールセットの一貫した適用を強く支持するように思われるため、お願いします。

はい。そして、このルールはこの小さなセットに属します。

8
Alexey Romanov