4

検討:

class Wrap(val amount :Int) extends AnyVal

object Wrap {
    @inline final def apply(int :Int) = new Wrap(int)
}

object Playground {
    val w = Wrap(1)
}      

(2.11.7) でscalac -feature -Xprint:all Playground.scalaコンパイル

Playground.this.w = Wrap.apply(1);

実際、次のjavap -v -private Playgroundことを示しています。

    89: invokevirtual #75                 // Method Wrap$.apply:(I)I
    92: putfield      #33                 // Field w:I

Playground コンストラクターを次のように変更する場合:

val w = new Wrap(1)

1両方とも、期待どおりにリテラルの割り当てを示しwています。率直に言って、この発見にはかなりがっかりしています。これは、値クラスを使用した型レベルのプログラミングを実質的に妨げているからです (一時的な値クラスのインスタンスは、単純なインライン メソッドのチェーンによって作成されます)。

4

0 に答える 0