【问题标题】:import to all package member files (package scope)导入到所有包成员文件(包范围)
【发布时间】:2015-08-18 18:25:59
【问题描述】:

我在一个包/目录中有多个类文件。类似这样:

文件 1:

package model
import same.library
class File1Class {}[...]

文件 2:

package model
import same.library
class File2Class {}[...]

等等……

成为package model 的一部分已经允许每个成员访问所有package model 定义的类,所以我想知道是否有办法将其扩展到导入,有效避免在每个文件中写入import same.library整个包都需要库吗?

【问题讨论】:

  • AFAIK 这是不可能的。但是在每个文件的顶部都有 import 语句并没有错。
  • 啊。那真不幸。是的,我同意这并没有什么问题,但似乎完全可以避免。

标签: scala import scope package


【解决方案1】:

我认为这不值得,但“只是为了科学”:

你可以使用包对象技巧:

为您导入的库定义一个别名,无论它是对象、类型还是函数(受scala.Predef 启发):

package object test {
  def pow = scala.math.pow _
}

然后所有这些包对象成员在同一个包中无需导入即可自动可用:

package test

object TestIt {
  val r = pow(2, 3)
}

以类似的方式,您可以通过隐式使用另一种方式。

将库执行的转换/操作定义为隐式:

package object test {
  implicit def strToInt(str: String): Int = str.length
}

隐式使用:

package test
object TestIt {
  val strLength: Int = "abc"
}

隐式不必放在包对象中,请参阅 Scala 找到隐式的其他地方的隐式解析。

另一种选择是使用函数范围,或者您可以以相同的方式使用对象范围:

package test

trait Library {
  def doSmth: String = "It works"
}
object Library extends Library

object Scope {
  def libraryScope[T](codeBlock: Library => T): T = {
    codeBlock(Library)
  }
}

然后像这样使用它:

package test

object SecondTest {
    Scope.libraryScope { lib => lib.doSmth }
}

在所有 3 种情况下,您都可以通过在其他地方使用一次来避免使用导入。除非您有一些特殊情况,否则所有这些选项并不能真正使您的代码更清晰。

【讨论】:

    猜你喜欢
    • 2022-12-04
    • 2013-01-03
    • 2021-10-26
    • 2021-03-28
    • 2017-01-08
    • 2019-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多