Несколько присвоение некортежей в scala

Просто для уточнения, когда я говорю, что несколько присвоение, найдите что-либо подобное присвоению, destructuring связывают, я имею в виду следующий драгоценный камень сопоставления с образцом

scala> val (x,y) = Tuple2("one",1)
x: java.lang.String = one
y: Int = 1

который присваивается "one" к x и 1 к y.

Я пытался сделать

val (x,y) = "a b".split()

Я ожидал, что scala попытается скопировать, соответствуют массиву шаблону и выдал бы исключение на этапе выполнения, если длина массива не будет соответствовать длине шаблона.

Все мои попытки легко преобразовать Array к a Tuple2 были бесполезны.

scala> Tuple2(Array(1,2):_*)
<console>:7: error: wrong number of arguments for method apply: (T1,T2)(T1, T2)
in object Tuple2
       Tuple2(Array(1,2):_*)
       ^

scala> Tuple2(Array(1,2).toList:_*)
<console>:7: error: wrong number of arguments for method apply: (T1,T2)(T1, T2)
in object Tuple2
       Tuple2(Array(1,2).toList:_*)

Там какой-либо аккуратный путь состоит в том, чтобы использовать несколько присвоение с массивами или списками?

31
задан Dario 4 March 2010 в 18:31
поделиться

2 ответа

Все, что вам нужно сделать, это сделать вашу сторону val (слева от = ) совместимой с вашим инициализатором (справа от = ):

scala> val Array(x, y, z) = "XXX,YYY,ZZZ".split(",")
x: java.lang.String = XXX
y: java.lang.String = YYY
z: java.lang.String = ZZZ

Как вы и ожидали, scala.MatchError будет выдан во время выполнения, если размер массива не совпадает (не 3 в приведенном выше примере).

49
ответ дан 27 November 2019 в 21:56
поделиться

Поскольку ваша строка может иметь произвольное содержимое, система типов не может гарантировать, что результат будет иметь форму с двумя кортежами (и никакое преобразование не имеет никакого смысла). Поэтому вам все равно придется иметь дело с последовательностями (например, с массивами).

К счастью, есть шаблоны последовательности с правильным игнорированием , которые, тем не менее, позволяют вам удобно сопоставлять значения результатов.

val Seq(x, y, _ @ _*) = "a b".split(" ")
12
ответ дан 27 November 2019 в 21:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: