1. ホーム
  2. scala

Scalaのapply()メソッドのマジックはどうなっているのか?

2023-08-24 20:20:51

質問

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

どのように解決するのですか?

あなたが最初に言ったことより深いことはないと思います。これは単なる構文上の糖分で、コンパイラが f(a)f.apply(a) を特殊な構文ケースとして使用します。

これは特殊なルールのように思えるかもしれませんが、ごく一部(例えば update ) では DSL -のような構成とライブラリが可能です。