导入到所有包成员文件(包范围)
import to all package member files (package scope)
我在一个 package/directory 中有多个 class 个文件。类似这样:
文件 1:
package model
import same.library
class File1Class {}[...]
文件 2:
package model
import same.library
class File2Class {}[...]
等...
作为 package model
的一部分已经允许每个成员访问所有 package model
定义的 classes,所以我想知道是否有一种方法可以有效地将其扩展到导入如果整个包中需要该库,请避免在每个文件中写入 import same.library
?
我觉得不值得,但是"just for the science":
您可以使用包对象技巧:
为导入的库定义别名,无论它是对象、类型还是函数(受 scala.Predef
启发):
package object test {
def pow = scala.math.pow _
}
然后所有这些包对象成员都自动可用,无需在同一个包中导入:
package test
object TestIt {
val r = pow(2, 3)
}
以类似的方式,您可以使用另一种方式通过隐式实现。
定义一个 transformation/operation 你的库作为一个隐含的:
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 种情况下,您通过在其他地方使用一次来避免使用导入。所有这些选项并不能真正使您的代码更清晰,除非您有一些特殊情况。
我在一个 package/directory 中有多个 class 个文件。类似这样:
文件 1:
package model
import same.library
class File1Class {}[...]
文件 2:
package model
import same.library
class File2Class {}[...]
等...
作为 package model
的一部分已经允许每个成员访问所有 package model
定义的 classes,所以我想知道是否有一种方法可以有效地将其扩展到导入如果整个包中需要该库,请避免在每个文件中写入 import same.library
?
我觉得不值得,但是"just for the science":
您可以使用包对象技巧:
为导入的库定义别名,无论它是对象、类型还是函数(受 scala.Predef
启发):
package object test {
def pow = scala.math.pow _
}
然后所有这些包对象成员都自动可用,无需在同一个包中导入:
package test
object TestIt {
val r = pow(2, 3)
}
以类似的方式,您可以使用另一种方式通过隐式实现。
定义一个 transformation/operation 你的库作为一个隐含的:
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 种情况下,您通过在其他地方使用一次来避免使用导入。所有这些选项并不能真正使您的代码更清晰,除非您有一些特殊情况。