2013-09-01 4 views
1

Можете ли вы мне помочь в понимании поведениякортежей в Scala не работают, как ожидалось

//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 Repository. Ссылка: Scala Worksheet

ответ

3

Вы должны поставить один _ за каждый неиспользованный член кортежа.

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

Ok. Понял. Значит, это не похоже на var args в Java? Если мне нужно поставить _ для каждого неиспользуемого члена кортежа, значит, мне нужно знать, сколько элементов есть в Tuple, не так ли? –

+2

Нет похожих шаблонов в функциональных языках. Если этого недостаточно, вы можете заменить кортеж классом и использовать его функции выбора для доступа к членам. Если данные просты, вы можете создать класс case, который очень похож на кортеж. –

+2

Это как раз шаблон. Сравнить 'val is = List (1,2,3,4); val List (x, y, _ *) = is'. Так что да, для обычного TupleN вы должны знать arity N. –

Смежные вопросы