Я изучаю функцию соответствия с кортежем и не могу понять, почему это выдает ошибку:

val t = (2,3)
val params = t match {
  case t._1 == 2 => println("first element is 2")
  case t._2 == 3 => println("second element is 3")
  case _ => println("no matches")
}

Выдает следующую ошибку для операторов сравнения 1 и 2

not found: value ==

Был бы признателен, если кто-то может объяснить, почему это не сработает?

0
user1596115 21 Авг 2018 в 09:16

3 ответа

Лучший ответ

Вы дали match простое условие, но для выражения match требуется шаблон, сопоставляемый со значением, и необязательное условие, которому предшествует if.

Итак, в вашем случае это будет выглядеть так:

val t = (2,3)
val params = t match {
  case (a, _) if a == 2 => println("first element is 2")
  case (_, b) if b == 3 => println("second element is 3")
  case _ => println("no matches")
}

Отредактировано, чтобы исправить ошибку, указанную в комментариях

2
Tim 21 Авг 2018 в 07:37

TL; DR Вы должны match вещь с другой вещью (или описанием вещи ) . Вы не можете match вещь с условием.


t match {
  case a => // a and t are the same
}

Это всегда будет совпадать, потому что значение t может быть помещено в новую переменную a.

t match {
  case (a,b) => // a & b hold the values of the tuple elements
}

Это будет соответствовать, только если t является 2-кортежем.

t match {
  case (a,b) if a < b => // a & b hold the values of the tuple elements only if a < b
}

Это будет соответствовать, только если t является 2-кортежем И элементы сравнимы И 1-й элемент меньше 2-го.

Также обратите внимание, что println() возвращает Unit, что означает, что ваша переменная params всегда будет иметь одинаковое пустое значение. Давайте исправим это вместе с остальным кодом.

val t = (2,3)
val status :String = t match {
  case (a,_) if a == 2 => "first element is 2"
  case (_,b) if b == 3 => "second element is 3"
  case _ => "no matches"
}

Обратите внимание, что только один case может соответствовать. Если первый совпадает, то ни один из остальных не будет проверен.

2
jwvh 21 Авг 2018 в 07:28
val t = (2,3)
val params = t match {
  case (2, _) => println("first element is 2")
  case (_, 3) => println("second element is 3")
  case _ => println("no matches")
}
1
Bogdan Vakulenko 21 Авг 2018 в 12:12
51942646