Это не возможно сделать это с помощью пакетов Scala, в общем. Как правило, вы бы только псевдоним пакета локально в файле:
import scala.{ math => physics }
scala> physics.min(1, 2)
res6: Int = 1
Но это не то, что вы спрашиваете. Сами пакеты не являются значениями или типами, поэтому вы не можете назначать их как таковые. Они будут терпеть неудачу:
type physics = scala.math
val physics = scala.math
С объектом пакета, вы можете захватить Ахольд это конкретные члены, но не классы внутри. Например:
scala> val physics = scala.math.`package`
physics: math.type = [email protected]
scala> physics.min(1, 2)
res0: Int = 1
Но использование объектов или типов, которые принадлежат к традиционной упаковке не будет работать:
scala> scala.math.BigDecimal(1)
res1: scala.math.BigDecimal = 1
scala> physics.BigDecimal(1)
<console>:13: error: value BigDecimal is not a member of object scala.math.package
physics.BigDecimal(1)
^
Ok, так что вы должны делать?
Причина, по которой вы даже рассматриваете это, заключается в том, что вы хотите скрыть реализацию той библиотеки, которую вы используете, чтобы ее можно было легко заменить позже. Если это так, то вам следует скрыть библиотеку в другом интерфейсе или объекте (фасад). Это не означает, что вам нужно пересылать каждый метод и значение, содержащиеся в библиотеке, только тот, который вы фактически используете. Таким образом, когда дело доходит до перехода на другую библиотеку, вам нужно только изменить один класс, потому что остальная часть кода будет ссылаться только на фасад.
Например, если мы хотим использовать min
и max
из scala.math
, но позже хотели заменить его на другую библиотеку, которая обеспечивает более эффективное решение (если такая вещь существует), мы могли бы создать фасад, как это:
object Math {
def min(x: Int, y: Int): Int = scala.math.min(x, y)
def max(x: Int, y: Int): Int = scala.math.max(x, y)
}
Все остальные классы будут использовать Math.min
и Math.max
, так что, когда scala.math
был заменен, они могут оставаться таким же. Вы также можете сделать Math
признаком (без внедрения) и предоставить реализации в подклассе или объекте (скажем ScalaMath
), чтобы классы могли вводить различные реализации.
Это середина разметки библиотеки и наложение объекта пакета, который мой мозг не смог синтезировать. Немного утомительно, но это дает мне больше контроля, спасибо! –