Scala中的元组未按预期工作

Scala中的元组未按预期工作,scala,maps,tuples,Scala,Maps,Tuples,你能帮我了解一下这种行为吗 //Creating a tuple val myTuple = ("Sudipta","Deb","Switzerland",1234) //> myTuple : (String, String, String, Int) = (Sudipta,Deb,Switzerland,1234) myTuple._2

你能帮我了解一下这种行为吗

  //Creating a tuple
  val myTuple = ("Sudipta","Deb","Switzerland",1234)
                                                  //> myTuple  : (String, String, String, Int) = (Sudipta,Deb,Switzerland,1234)
  myTuple._2                                      //> res0: String = Deb
  myTuple._4                                      //> res1: Int = 1234
  val (first, second, third, fourth) = myTuple    //> first  : String = Sudipta
                                                  //| second  : String = Deb
                                                  //| third  : String = Switzerland
                                                  //| fourth  : Int = 1234
  //val (first1, second1, _) = myTuple
现在,最后一行给出了错误:

constructor cannot be instantiated to expected type;  found   : (T1, T2, T3)  required: (String, String, String, Int)
我的问题是为什么它会这样?在《不耐烦的Scala》一书中,这样写道:

You can use a _ if you don’t need all components:
val (first, second, _) = t

仅供参考,如果您想查看完整代码,可以在我的GitHub存储库中找到。链接:

您必须为每个未使用的元组成员放置一个

val (first1, second1, _, _) = myTuple

好啊知道了。所以它不像Java中的var args?如果我必须为每个未使用的元组成员放置u,那么这意味着我必须知道元组中有多少元素,对吗?不,这与函数式语言中的模式匹配类似。如果这还不够,您可以用类替换元组,并使用它的选择器函数访问成员。如果数据很简单,你可以创建一个非常像元组的case类,它就是一个模式匹配。比较
val is=List(1,2,3,4);val列表(x,y,*)=is
。所以是的,对于普通的TupleN,你们必须知道arity N。