Я столкнулся со следующим в коде Scala:
class MyClass { ... val a = new A; import a._ }
Что именно означает val a = new A; import a._
?
Я столкнулся со следующим в коде Scala:
class MyClass { ... val a = new A; import a._ }
Что именно означает val a = new A; import a._
?
Он импортирует методы и переменные объекта a. Поэтому, если вы хотите позвонить a.foo()
, вы можете просто позвонить foo()
.
Это означает, что все методы и переменные объекта a
типа A
теперь доступны в этом блоке (области действия) без явного упоминания a
. Итак, если у A
есть метод bar()
, теперь вы можете сказать:
bar()
вместо
a.bar()
но только в рамках, где определено import
.
Давайте объясним это чем-то, с чем вы должны быть знакомы:
println("Hello world")
Вопрос: почему это работает? Нет объекта с именем println
с методом apply
, что является обычным объяснением кода, который выглядит так. Ну, так получилось, что приведенный выше код действительно делает это:
Predef.println("Hello world")
Другими словами, println
— это метод объекта scala.Predef
. Итак, как вы можете использовать его, как указано выше? Ну вот так:
import scala.Predef._
println("Hello world")
Импорт содержимого стабильной ссылки (т. е. не var
или def
) сделает его методы доступными без префикса reference.
.
Он также делает доступными любые неявные преобразования, определенные внутри него, и именно так становятся доступными неявные преобразования, определенные внутри scala.Predef
— Scala импортирует содержимое java.lang
, scala
и scala.Predef
(в таком порядке, поэтому последние переопределяют более ранние) .