2015-03-27 2 views
2

У меня есть функция, которая возвращает кортеж, из которого один элемент также является кортежем.деконструировать сложный кортеж в Scala

def foo: (Any, (Any, Any)) 

Фактические типы не очень Any, но это упрощение фактического кода (и, следовательно, я перезаписать это соединение кортеж ради этого вопроса).

Теперь я деконструирую этот кортеж следующим образом, желая продолжить вычисление с помощью a1, a2, a3.

val (a1, bar) = foo 
val (a2, a3) = bar 

Есть ли один вкладыш для этого?

ответ

5

Конечно! Вы можете сопоставить шаблон так же.

def foo: (Any, (Any, Any)) = (1, (2, 3)) 

scala> val (a1, (a2, a3)) = foo 
a1: Any = 1 
a2: Any = 2 
a3: Any = 3 

Это работает, потому что у вас есть Tuple2[Any, Tuple2[Any, Any]] и Tuple2 имеет unapply определенный метод, который позволяет это шаблону произойдет.

3

Очень просто:

val (a1, (a2, a3)) = foo 
+0

Большое спасибо. Кстати, вы когда-нибудь находите, что возвращаете кортежи, или вы выкалываете класс для возврата каждой функции ..... Я продолжаю колебаться между двумя – matanster

+0

. Недостатком возврата кортежа является то, что просто глядя на возврат типа, трудно понять, что означает возвращаемое значение. Если вы используете класс, гораздо легче понять, что означает результат. – Jesper

+1

... за счет типового шаблона при написании действительно функционального кода. – matanster

1

Примечание стороны, вложенный кортеж может быть извлечен/образцом подобранных и далее вычисляются с помощью а, для понимания, как это,

val x = (1,(2,3)) 
for ((a,(b,c)) <- Seq(x)) yield a+b+c 

рассмотреть также соответствие по типу ,

val y = (1,("bb",3)) 
for ((_,(b:String,_)) <- Seq(x)) yield b 

или так же, как уже показано,

val (a:Int, (b: Double, c: String)) = (1, (2.0, "ccc")) 
a: Int = 1 
b: Double = 2.0 
c: String = ccc 
+0

Спасибо, а также в качестве примечания следует использовать «случай», а не просто деконструкцию 'val' или' for', для элегантной деконструкции внутри «карты» 'функция, например при отображении «Будущего» кортежей – matanster

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