如何匹配Scala中的字符?

如何匹配Scala中的字符?,scala,pattern-matching,Scala,Pattern Matching,好的,这听起来像是一个微不足道的问题 val delim = ',' val chars = "abc,def".toCharArray var i = 0 while (i < chars.length) { chars(i) match { case delim => println(s"($i): D!") case c => println(s"($i): $c") } i

好的,这听起来像是一个微不足道的问题

  val delim = ','
  val chars = "abc,def".toCharArray
  var i = 0
  while (i < chars.length) {
    chars(i) match {
      case delim =>
        println(s"($i): D!")
      case c =>
        println(s"($i): $c")
    }
    i += 1
  }
我预料到:

(0): a
(1): b
(2): c
(3): D!
(4): d
(5): e
(6): f
如何匹配字符值


注意:如果我硬连接delim char“case”,则“=>”会按预期工作!如果我使用字符类型的val,它为什么会中断?

您的模式匹配正在创建一个名为
delim
的第二个变量,该变量将第一个变量隐藏起来,并且由于一个新的未经修饰的变量匹配所有变量,因此这是唯一执行的
情况

使用back tics告诉编译器匹配现有变量,而不是新变量

  case `delim` =>

而且,
final val Delim=','
,也可以工作。注意大写字母和最后一个。@LuisMiguelMejíaSuárez只要大写就足够了。所有的
val
s都是最终的,您不需要添加它,它是多余的和令人困惑的。@Dima val并不意味着该字段是最终的。如果字段是final,则不能在子类中重写,而val可以是。@KrzysztofAtłasik是的,我假设这只是一个局部变量。@Dima在某些情况下,编译器要求
val
为final,以便模式匹配它们。我相信(虽然不是100%确定)val可以被覆盖。所以,我总是用final,可能是
  case `delim` =>