scala - 你能在 Scala 中动态导入吗?

标签 scala

我的项目依赖于一个库,该库包含在其路径中带有日期的包,例如:

import xyz.abc.201301.utils._

其中 201301 是过时版本。

有没有办法在一个地方声明这个包名,这样我就可以在使用这个依赖的各种类中引用它? 这样,当版本更改时,我只需要在我的代码中的一个地方更改它。

理想情况下,我想我可以声明

val libVersion = 201301

在一个地方,然后在客户端类中:

import xyz.abc.$libVersion.utils._

我知道这行不通,但有没有办法做类似的事情?

最佳答案

简短的回答:没有。

长答案:您可以以某种方式完成这项工作。您可以使用某种模板语言或预处理器,然后创建一个构建过程,在将 Scala 模板文件交给编译器之前对其进行预处理。

但这是个坏主意。这正是 Maven 或 SBT 等依赖管理系统的开发目的。在您的上下文中,版本化模块的想法是:您保留相同的包名称,包名称中没有日期。您创建一个构建过程,该过程还管理您的依赖项;为此,您需要使用 Maven 或 SBT。 (后者更适合 Scala。)您确保您所依赖的代码作为具有“快照”版本的单独模块交付,即每次解决依赖关系时,都会创建一个新版本。

如果您不希望或无法实现这样的过程,我建议至少限制损失。您可以创建一个中央包,为您需要使用的所有类型和对象设置别名:

package object current_api {
  // for types, i.e. traits or classes:
  type SomeType = xyz.abc.201301.SomeType
  // for singleton objects:
  val SomeCompanionObject = xyz.abc.201301.SomeCompanionObject
}

你改变你的构建过程,使这个 Scala 文件从某种模板生成;我对您的构建过程了解不足,无法提出建议。

使用 API 的代码可以简单地使用相同的导入:

import current_api._

// ...
val someInstance:SomeType = SomeCompanionObject.apply(arg1, arg2)

通过这种方式,您可以将依赖于日期的“导入”的范围限制为仅一个文件。

关于scala - 你能在 Scala 中动态导入吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29920117/

相关文章:

scala - 使用具有多个类型参数的类型类

java - 使用企业 Java Bean 提升

scala - 使用正则表达式时 Spark S3 访问被拒绝

arrays - 如何组合幺半群类型的数组?

scala - 为什么 Spark DataFrame 转换为 RDD 需要完全重新映射?

scala - 鼠标单击并悬停在 javafx2 上的奇怪行为

Java将原始字节编码为图像简单图像格式/文件

xml - 这是 scala.xml.Elem 中的错误吗?

scala - 如何使用隐式转换将List [A]转换为List [B]

Scala 通过嵌套的 Option/Try monads 过滤