Scala元组为构造函数解包

pro*_*eek 3 parameters constructor scala

我有一个带有两个参数的Scala类,另一个参数构造函数.对于一个参数构造函数,我调用一个方法来获取两个元素的元组,并尝试使用元组作为需要两个参数的构造函数的参数.这是一个例子:

def vals(v:Int) = {
    // computation
    (v,v) // returns two element tuple
}

class A(a:Int, b:Int) {
    def this(v:Int) = {
        this(vals(v))
    }
}

object Main extends App {
    val a = new A(10)
}
Run Code Online (Sandbox Code Playgroud)

但是,我得到类型不匹配错误.我在scala tuple解压缩中找到了一个解决方案,该解决方案适用于函数调用,但不适用于构造函数.

def foo(x: Int, y: Int) = x * y
def getParams = {
    (1,2)  //where a & b are Int
}

object Main extends App {
    println((foo _).tupled(getParams))
    println(Function.tupled(foo _)(getParams))
}
Run Code Online (Sandbox Code Playgroud)

怎么能解决这个问题?

Sha*_*nds 5

为类创建一个伴随对象,并为其添加一些"工厂"("apply")方法,然后抛弃额外的构造函数,转而使用工厂方法.vals如果你愿意的话,你也可以在那里包括方法以保持一致(尽管你可以将它定义在其他地方,如果这对你更好).然后你最终得到如下内容:

class A(val a:Int, val b:Int)

object A {

  def apply(pair: (Int, Int)): A = new A(pair._1, pair._2)

  def apply(v: Int): A = A(vals(v))

  def vals(v:Int) = {
    // computation
    (v,v) // returns two element tuple
  }
}
Run Code Online (Sandbox Code Playgroud)

并创建你A的:

scala> val a = A(10)
a: A = A@36d6ec03

scala> a.a
res6: Int = 10
Run Code Online (Sandbox Code Playgroud)

请注意,我将'a'和'b'字段声明为'val'.这使他们可以访问,如a.a上面的行.事实上,我建议制作A一个"案例类",例如.case class(a: Int, b: Int)它会自动为字段添加'val',并为您创建一个伴侣类(使用另一个默认的"apply"方法,两个Ints).您还可以得到实现toString,equals以及hashcode免费的.