【问题标题】:Import package as another将包作为另一个导入
【发布时间】:2012-11-29 13:26:42
【问题描述】:

假设我有一个 Scala 项目,在包 com.example.a.b.c 下有一堆案例类。我想将所有这些类导入一个包com.example.c(其中包含更多非冲突案例类),以便在我的项目中的其他任何地方,我只需要import com.example.c._ 即可使用来自com.example.c 的每个案例类和com.example.a.b.c

我该怎么做?

【问题讨论】:

  • 您是否只是想以一种合乎逻辑的方式组织您的代码,并且您对组织有控制权吗?如果是这样,您可以在特征(或特征)中定义您的 com.example.a.b.c 案例类,然后编写 package object c extends ThatTrait。例如,Scalaz 广泛使用这种方法。
  • 这是一个有趣的方法!我必须与团队讨论它,因为我实际上无法控制 com.example.a.b.c

标签: scala import package


【解决方案1】:

有关于添加 export 机制的讨论,它会做你想做的事,但不清楚这是否会发生。

无论如何,目前唯一的办法就是

  • 定义每个类的类型
  • 设置一个等于每个对象的 val

例如,

package bar
case class Foo(i: Int) {}

需要在另一个包中模仿

package object baz {
  type Foo = bar.Foo
  val Foo = bar.Foo
}

当遇到这种情况时,人们通常只会满足于额外的一两次导入。

【讨论】:

  • 谢谢雷克斯!公认!我同意额外的导入是一个简单的解决方案,但是当你在任何地方都需要这些并最终得到 4 个额外的导入语句时,这真的很痛苦。出于维护目的,我宁愿将重大更改放在一个地方。
【解决方案2】:

scala 中的 import 语句只是告诉编译器在哪里可以找到其他类,就像在 java 中一样,不像 C/C++ 中的 #include 指令,编译器会物理复制整个头文件。如果您想使用来自com.example.a.b.c 的案例类,您应该从它们自己的包中导入它们,因为这是常规方式。

【讨论】:

    猜你喜欢
    • 2019-11-08
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    • 2020-02-24
    • 1970-01-01
    相关资源
    最近更新 更多