79

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 は、多くの例外を含む多くのルールよりも、より小さなルール セットを一貫して適用することを強く支持しているように思われるためです。これは、最初は例外のように思えます。

4

3 に答える 3

67

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

これは特定のルールのように思えるかもしれませんが、 DSLのような構造とライブラリーを許可するのは、そのうちのいくつか (たとえば、 with update)だけです。

于 2009-08-03T18:33:39.630 に答える
20

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

このトピックの詳細については、Scala 言語仕様のセクション6.6: 関数アプリケーションを参照してください。

于 2009-08-03T18:28:27.580 に答える
8

Scala は、多くの例外を含む多くのルールよりも、より小さなルール セットを一貫して適用することを強く支持しているように思われるためです。

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

于 2009-08-03T21:07:40.287 に答える