如何将对象的引用传递给Scala中的方法?例如。我希望这个编译
object Constants {
val constantA:Double = ???
}
def calc(numbers:Seq[Double], Constants) = ??? // does not compile
def calc(numbers:Seq[Double], constants:Constants) = ??? // does not compile
当然我可以引用Constants
而不通过参数列表,但我更愿意列出将方法的所有依赖项显式地作为参数传递。
答案 0 :(得分:12)
Constants
是一个对象。您没有将对象指定为方法参数的参数类型,您将 types 指定为方法参数的参数类型:
def calc(numbers:Seq[Double], constants: Constants.type) = ???
一般来说,更精确的类型是好的,但在这种情况下,它可能会过度使用过于精确的类型,因为只有一个Constants.type
类型的实例,所以你不能传递除Constants
对象之外的任何东西作为参数,这使得“参数化”的整个想法变得毫无意义。
答案 1 :(得分:4)
您可以使用任何类型
def calc(numbers:Seq[Double], constants: Any)
但这不允许您访问constantA值。或者,您可以使用常量定义特征,并让对象实现:
trait ConstantA {
val constantA:Double
}
object Constant extends ConstantA {
override val constantA:Double = 0.0
}
def calc(numbers:Seq[Double], constants: ConstantA) {
...
// use constants.constantA
println(constants.constantA)
...
}
答案 2 :(得分:3)
除了JörgWMittag的答案,您还可以创建一个界面:
trait IConstants {
def constantA: Double
}
object Constants extends IConstants {
val constantA: Double = ???
}
def calc(numbers:Seq[Double], constants: IConstants) = ???
这是否有用取决于您的具体情况。
答案 3 :(得分:-3)
查看方法定义的synthax:calc方法产生什么?单位?国际?我建议您先查看Scala synthax的基础知识