【问题标题】:Scala: Is there a default class if no class is defined?Scala:如果没有定义类,是否有默认类?
【发布时间】:2011-09-02 06:10:05
【问题描述】:

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

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

scala> hoho("rahul")
hoho rahul

在这个例子中,方法属于哪个类?

【问题讨论】:

    标签: scala


    【解决方案1】:

    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))
          }
        }
      }
    }
    

    所以你的方法hoho 真的是$line1.$read.$iw.$iw.hoho。然后当你稍后使用hoho("foo") 时,它会重写以添加包和外部对象。

    附加说明:对于脚本,-Xprint:typer (-Xprint:parser) 表明代码被包装在对象 main(args:Array[String]) 的代码块中 Main。您可以通过 argsargv 访问参数。

    【讨论】:

    • 谢谢。如果我将方法定义保存在 .scala 脚本中并使用 scala 执行它,也会发生同样的情况吗?
    • @Rahul,我添加了脚本信息,机制不同。
    猜你喜欢
    • 1970-01-01
    • 2012-09-14
    • 2012-11-09
    相关资源
    最近更新 更多