如何将元组收集到单独的变量中

时间:2017-06-14 06:48:58

标签: scala tuples

def giveMeTuple: Tuple2[String, String] = {
    Tuple2("one", "two")
}

def testFive: Unit = {
    val one, two = giveMeTuple
    println(one)
    println(two)
    ()
}

testFive

产地:

(one,two)
(one,two)

但我在期待:

one
two

onetwo的初始化是怎么回事?

2 个答案:

答案 0 :(得分:4)

几乎就在那里。 这就是你需要的:

val (one, two) = giveMeTuple

使用

val one, two = giveMeTuple

你说的是:用one返回的值初始化giveMeTuple并初始化two返回的giveMeTuple值(在这种情况下giveMeTuple将被调用两次)

另一个类似的例子是

val one, two = 1

其中两者都将初始化为值1

相反,您希望解构返回giveMeTuple的值,并从元组中获取第一个和第二个值。在这种情况下,giveMeTuple只会被调用一次。

答案 1 :(得分:2)

您缺少括号:

val (one, two) = giveMeTuple

如果我们反编译上面的代码,我们会发现这只是元组模式,它是Scalas模式匹配功能的一部分:

def main(args: Array[String]): Unit = {                                                                                              
  private[this] val x$1: (String, String) = (TupleTest.this.giveMeTuple: (String, String) @unchecked) match { 
    case (_1: String, _2: String)(String, String)((one @ _), (two @ _)) => scala.Tuple2.apply[String, String](one, two)              
  };                                                                                                                                 
  val one: String = x$1._1;                                                                                                          
  val two: String = x$1._2;                                                                                                          
  ()
}        

虽然您的示例是对同一方法的双重调用并赋值为新值:

def giveMeTuple: (String, String) = scala.Tuple2.apply[String, String]("one", "two"); 
def main(args: Array[String]): Unit = {                                               
   val one: (String, String) = TupleTest.this.giveMeTuple;                             
   val two: (String, String) = TupleTest.this.giveMeTuple;                             
   ()                                                                                  
 }