在Seala非vararg方法中将Seq作为参数传递

时间:2016-04-06 07:44:51

标签: scala

我在Scala中有一个方法,它有一定数量的参数,其签名我无法改变:

def myMethod(a1: Int, a2: Int, a3: Int): Int = { /* stuff happens */ }

我还有一个数组arr,其数量与myMethod中的参数完全相同。如果myMethod是vararg方法,我可以使用奇怪的: _*表示法将数组作为参数传递。我想做像

这样的事情
myMethod(/*some Scala magic with arr*/)

有没有办法在Scala中优雅地执行此操作,不需要myMethod成为vararg?

2 个答案:

答案 0 :(得分:5)

我认为你最接近的是在调用你的方法之前在一个步骤中解构你的数组:

val Array(a1, a2, a3) = arr
myMethod(a1, a2, a3)

答案 1 :(得分:3)

请注意,您可能无法更改签名,但可以通过隐式转换添加重载

class A {
  def myMethod(a1: Int, a2: Int, a3: Int): Int = 5
}

implicit class ExA(self: A) extends AnyVal {
  def myMethod(arr: Array[Int]): Int = {
    val Array(a1, a2, a3) = arr
    self.myMethod(a1, a2, a3)
  }
}

然后你就可以传递你的数组了,如果它不是3个元素,你将在运行时得到错误。

scala> (new A).myMethod(Array(1, 2, 3))
res2: Int = 5

没有任何额外的知识,编译器不能像你一样确定数组的大小,因此似乎没有办法将一些任意数组扩展为3个参数并将其放入函数中。