如何将对象传递给Scala中的方法

时间:2017-03-13 10:51:07

标签: scala methods singleton

如何将对象的引用传递给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而不通过参数列表,但我更愿意列出将方法的所有依赖项显式地作为参数传递。

4 个答案:

答案 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的基础知识