字符串的大小写匹配模式的不同行为

时间:2019-07-10 05:13:10

标签: scala pattern-matching

我正在尝试在诸如java switch-case语句switch(someString)之类的case类中使用字符串。但是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 个答案:

答案 0 :(得分:3)

这是因为您没有正确使用它-实际上您是将whichTopic变量“别名”为accountsusers变量的2种情况,但未指定什么是关于他们的“特殊”。

您应该执行以下操作:

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

这是一种检查字符串是否以accountsusers开头的情况。

当然,您可以将startsWith替换为所需的任何字符串方法,例如contains或其他适合您情况的东西。

答案 1 :(得分:3)

  

啊...所以我从不使用变量来确定它必须去哪个块。

如果要检查与现有变量的相等性,可以编写

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

(如Gal Naor的回答)或

case `accounts` => ...