object ScalaTrueRing {
def rule = println("To rule them all")
}
このコードは Java バイト コードにコンパイルされます。逆コンパイルすると、同等の Java コードは次のようになります。
public final class JavaTrueRing
{
public static final void rule()
{
ScalaTrueRing..MODULE$.rule();
}
}
/* */ public final class JavaTrueRing$
/* */ implements ScalaObject
/* */ {
/* */ public static final MODULE$;
/* */
/* */ static
/* */ {
/* */ new ();
/* */ }
/* */
/* */ public void rule()
/* */ {
/* 11 */ Predef..MODULE$.println("To rule them all");
/* */ }
/* */
/* */ private JavaTrueRing$()
/* */ {
/* 10 */ MODULE$ = this;
/* */ }
/* */ }
これは 2 つのクラスにコンパイルされます。Scala.net コンパイラを使用すると、MSIL コードにコンパイルされます。同等の C# コードは次のようになります。
public sealed class ScalaTrueRing
{
public static void rule()
{
ScalaTrueRing$.MODULE$.rule();
}
}
[Symtab]
public sealed class ScalaTrueRing$ : ScalaObject
{
public static ScalaTrueRing$ MODULE$;
public override void rule()
{
Predef$.MODULE$.println("To rule them all");
}
private ScalaTrueRing$()
{
ScalaTrueRing$.MODULE$ = this;
}
static ScalaTrueRing$()
{
new ScalaTrueRing$();
}
}
また、2 つのクラスにコンパイルされます。
Scala コンパイラ (Java 用と .NET 用) がこれを行うのはなぜですか? 静的ルール メソッドで println メソッドを呼び出すだけではないのはなぜですか。