导入到所有包成员文件(包范围)

时间:2015-06-04 08:31:47

标签: scala import scope package

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

文件1:

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

文件2:

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

等...

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

1 个答案:

答案 0 :(得分:4)

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

您可以使用包对象技巧:

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

不必将Implicits放在包对象中,请参阅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种情况下,您可以避免在其他地方使用导入一次。除非你有一些特殊情况,否则所有这些选项并不能使你的代码更加清晰。