【问题标题】:How to Do Nested Imports如何进行嵌套导入
【发布时间】:2020-11-03 16:16:57
【问题描述】:

我正在尝试清理我的用户 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

从我读到的here,我理解这意味着嵌套导入是不可能的。

那么我想做的事情是不可能的吗?我意识到存在其他方式。

【问题讨论】:

  • 这不是传递的,只是通配符导入。没有这样的传递导入。

标签: scala object import package library-design


【解决方案1】:

在 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
}

以防万一,我只想提一下这会中断,例如宏注解,就好像您在宏注解类型中有这样的别名,编译器将无法识别它应该使用原始类型的宏扩展来处理它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 2022-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-15
    相关资源
    最近更新 更多