我在一个包/目录中有多个类文件。类似于:
文件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 }
}
在这三种情况下,您通过在其他地方使用它们来避免使用导入。所有这些选项并不能让你的代码更清晰,除非你有一些特殊的情况。