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

Scala 字符串大小写匹配模式的不同行为,scala,pattern-matching,Scala,Pattern Matching,我试图在一个case类中使用字符串,比如java switch case语句switchsomeString。但是scala match语句总是解析为第一个块 whichTopic match { case accounts ⇒ { logger.info("!!!! ---- FOR ACCOUNTS --- !!! ") } case users ⇒ { logger.info("!!!! ---- FOR USERS --- !!! ") // TOD

我试图在一个case类中使用字符串,比如java switch case语句switchsomeString。但是scala match语句总是解析为第一个块

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

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

即使whichTopic值有用户,它也会进入accounts块

这是因为您没有正确使用它-您实际做的是将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 --- !!! ")
}
这是一种检查字符串是否以帐户或用户开头的情况

当然,您可以用任何字符串方法替换startsWith,比如contains或其他适合您的情况的方法


啊…所以我从来没有用这个变量来确定它要去哪个块

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

case x if x == accounts => ...
就像Gal Naor的回答或

case `accounts` => ...

case x=>将匹配所有输入,因为x是一个未绑定的变量,可以保存任何匹配的值。案例账户=>是相同的。您正在创建一个名为accounts的变量,它可以保存并匹配任何值。啊…所以我从来没有使用该变量来标识它必须转到哪个块。谢谢你的解释。