Scala:如果没有定义类,是否有默认类?

Rah*_*hul 13 scala

根据,Scala的方法属于一类.但是,如果我在REPL或脚本中定义一个方法然后使用scala执行,那么该方法属于哪个类?

scala> def hoho(str:String) = {println("hoho " + str)}
hoho: (str: String)Unit

scala> hoho("rahul")
hoho rahul
Run Code Online (Sandbox Code Playgroud)

在此示例中,该方法属于哪个类?

huy*_*hjl 17

REPL自动包装对象中的所有语句(实际上是重写语句).如果使用以下-Xprint:typer选项打印中间代码,则可以看到它的运行情况:

scala> def hoho(str:String) = {println("hoho " + str)}
[[syntax trees at end of typer]]// Scala source: <console>
package $line1 {
  final object $read extends java.lang.Object with ScalaObject {
    def this(): object $line1.$read = {
      $read.super.this();
      ()
    };
    final object $iw extends java.lang.Object with ScalaObject {
      def this(): object $line1.$read.$iw = {
        $iw.super.this();
        ()
      };
      final object $iw extends java.lang.Object with ScalaObject {
        def this(): object $line1.$read.$iw.$iw = {
          $iw.super.this();
          ()
        };
        def hoho(str: String): Unit = scala.this.Predef.println("hoho ".+(str))
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

所以你的方法hoho确实如此$line1.$read.$iw.$iw.hoho.然后,当您hoho("foo")稍后使用时,它将重写以添加包和外部对象.

其他备注:为脚本,-Xprint:typer(-Xprint:parser)显示,该代码被包裹在一个码块内main(args:Array[String])的对象的Main.您可以使用args或访问参数argv.