Scala: существует ли класс по умолчанию, если класс не определен?
В соответствии с этим методы Scala принадлежат классу. Однако, если я определю метод в REPL или в сценарии, который я затем выполню с использованием scala, к какому классу принадлежит метод?
scala> def hoho(str:String) = {println("hoho " + str)}
hoho: (str: String)Unit
scala> hoho("rahul")
hoho rahul
В этом примере к какому классу принадлежит метод?
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
, У вас есть доступ к аргументам как args
или же argv
,