2015-11-18 2 views
1

Есть ли удобный экстрактор, который является отражением (в математическом смысле) оператора ->?Вложенный экстрактор кортежа в scala ->

Например, это работает:

scala> val y = 1 -> 2 -> 3 
y: ((Int, Int), Int) = ((1,2),3) 

scala> y match { case ((a,b),c) => s"Values are : $a, $b, and $c" } 
res0: String = Values are : 1, 2, and 3 

Но это не делает:

scala> y match { case a -> b -> c => s"Values are : $a, $b, and $c" } 
<console>:9: error: not found: value -> 
       y match { case a -> b -> c => s"Values are : $a, $b, and $c" } 
            ^
<console>:9: error: not found: value a 
       y match { case a -> b -> c => s"Values are : $a, $b, and $c" } 
                  ^

Вы можете увидеть, как это было бы полезно, если у вас есть несколько вложенных кортежей. В случае, если вам интересно, мои вложенные кортежи создаются внешней библиотекой, поэтому я не могу просто «сгладить» себя.

+0

Ссылка @johny предоставленном ответ. Но мне просто интересно, есть ли причина, почему вы предпочитаете «1 -> 2 -> 3' over' (1, 2, 3)'? Если вы используете '1 -> 2 -> 3', вы по-прежнему будете видеть время от времени' ((1, 2), 3) '(на выходе или в отладке), и он выглядит уродливым – Archeg

+0

@johny да это точно тот же вопрос. Благодарю. – Luciano

+0

@Archeg, как я сказал в вопросе, это потому, что я получаю это от внешней библиотеки в этой форме ... – Luciano

ответ

0

Попробуйте следующий

scala> y match { case ((z01,z02),z2) => println(s"$z01 -> $z02 -> $z2") } 
1 -> 2 -> 3 

scala> 
+1

То, что я пытаюсь избежать, - это вложенные круглые скобки после 'case', которые вы все еще используете. Например, если у вас уровень вложенности 5, вам нужно будет написать '((((z0, z1), z2), z3), z4), z5)', что является беспорядком. вместо этого я хочу сделать 'case z0 * z1 * z2 * z3 * z4 * z5 =>', где '*' - некоторый двоичный оператор. – Luciano

+0

Не используйте кортежи в этом случае. Преобразуйте структуру в дерево как набор 'case classe'. – Rumoku

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

  • Нет связанных вопросов^_^