导入到所有包成员文件(包作用域)



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

文件1:

package model
import same.library
class File1Class {}[...]
文件2:

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

等等……

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

我认为这并不值得,但"只是为了科学":

你可以使用包对象技巧:

为导入的库定义别名,无论它是对象、类型还是函数(受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 }
}

在这三种情况下,您通过在其他地方使用它们来避免使用导入。所有这些选项并不能让你的代码更清晰,除非你有一些特殊的情况。

最新更新