Различное поведение шаблона соответствия регистра для строк - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь использовать строки в классе case, как в выражениях java switch-case switch(someString).Но оператор scala match всегда разрешается в первый блок.

whichTopic match {
  case accounts ⇒ {
    logger.info("!!!! ---- FOR ACCOUNTS --- !!! ")

  }
  case users ⇒ {
    logger.info("!!!! ---- FOR USERS --- !!! ")
    // TODO : Handle errors from the consumer
  }
}

Даже если значение whichTopic имеет users, оно переходит в блок accounts

Ответы [ 2 ]

3 голосов
/ 10 июля 2019

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

Если вы хотите проверить равенство существующей переменной, вы можете написать

case x if x == accounts => ...

(как в ответе Гала Наора) или

case `accounts` => ...
3 голосов
/ 10 июля 2019

Это потому, что вы не использовали его правильно - то, что вы на самом деле сделали, это 2 случая "псевдонима" переменной whichTopic для accounts или users переменных, но вы не указали, что является "особенным" вих.

Вы должны сделать что-то вроде:

whichTopic match {
  case accounts if accounts.startsWith("accounts") => logger.info("!!!! ---- FOR ACCOUNTS --- !!! ")
  case users if users.startsWith("users") => logger.info("!!!! ---- FOR USERS --- !!! ")
}

Это случай, чтобы проверить, начинаются ли строки с accounts или users.

OfКонечно, вы можете заменить startsWith на любой строковый метод, например, contains или другой, подходящий для вашего случая.

...