我在一个包/目录中有多个类文件。与此类似:
文件1:
package model
import same.library
class File1Class {}[...]
文件2:
package model
import same.library
class File2Class {}[...]
等...
成为package model
的一部分已经允许每个成员访问所有package model
定义的类,所以我想知道是否有办法将其扩展到导入,有效地避免写{{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种情况下,您可以避免在其他地方使用导入一次。除非你有一些特殊情况,否则所有这些选项并不能使你的代码更加清晰。