Scala: существует ли класс по умолчанию, если класс не определен? - PullRequest
13 голосов
/ 02 сентября 2011

Согласно это , методы Scala принадлежат классу.Однако, если я определю метод в REPL или в сценарии, который затем выполняю с использованием scala, к какому классу относится этот метод?

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

scala> hoho("rahul")
hoho rahul

В этом примере к какому классу относится метод?

1 Ответ

17 голосов
/ 02 сентября 2011

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.У вас есть доступ к аргументам как args или argv.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...