Как сделать вложенный импорт - PullRequest
0 голосов
/ 14 июля 2020

Я пытаюсь очистить свой пользовательский api, чтобы пользователи могли аккуратно импортировать из одного объекта пакета и получить все содержимое внутри. Я понимаю, что могу просто переместить свои пакеты в верхний пакет, но мне было интересно, есть ли способ сделать следующее (я понимаю, что это может быть не лучшая практика):

У меня есть следующие пакеты :

package org.Me.packages.packageA

case class A() {
// some implementation
}

package org.Me.packages.packageB

case class B() {
// some implementation
}

Теперь это потребует импорта формы:

import org.Me.packages.packageA.A
import org.Me.packages.packageB.B

Меня попросили сделать следующее:

package org.Me.combinedPackages

package object Combined {
   import org.Me.packages.packageA.A
   import org.Me.packages.packageB.B 
}

Так что мой конечный пользователь может просто сделать:

import org.Me.combinedPackages._

// access both a and b here

из того, что я прочитал здесь , я понимаю, что это означает, что вложенный импорт невозможен.

Вот что я пытаюсь сделать невозможно? Я понимаю, что существуют и другие способы.

1 Ответ

6 голосов
/ 14 июля 2020

В Dotty то, что вы хотите сделать, будет возможно через export (двойное на import):

package org.Me.combinedPackages


export org.Me.packages.packageA.A
export org.Me.packages.packageB.B 

В Scala 2, однако вам придется :

  • используйте псевдоним типа для каждого типа, который вы хотите «передать» как доступный из вашего пакета
  • используйте val для каждого (сопутствующего) объекта, который вы хотите для перенаправления через ваш пакет
package my.package

// imported as my.package.exported._
package object exported {

  type NormalType = some.other.package.NormalType
  val NormalType: some.other.package.NormalType.type =
    some.other.package.NormalType
  
  type ParametricType[F[_], A] = some.other.package.ParametricType[F, A]
  val ParametricType: some.other.package.ParametricType.type =
    some.other.package.ParametricType

  // be careful to not import things that are automatically imported
  // e.g. implicits in companions, and avoid importing the same implicit
  // twice from two different packages
  implicit val redirectedImplicit: some.other.package.SomeImplicit =
    some.other.package.SomeImplicit
}

На всякий случай я просто упомяну, что это нарушает, например, аннотации макросов, как будто у вас есть такой псевдоним в типе аннотации макроса, компилятор не распознает что он должен был обработать это, используя расширение макроса исходного типа.

...