【问题标题】:How can I match on a Char in Scala?如何在 Scala 中匹配 Char?
【发布时间】:2019-04-01 20:29:56
【问题描述】:

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

  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): D!
(1): D!
(2): D!
(3): D!
(4): D!
(5): D!
(6): D!

我预料到了:

(0): a
(1): b
(2): c
(3): D!
(4): d
(5): e
(6): f

如何匹配 Char 值?

注意:如果我硬连线 delim char "case ',' =>",它会按预期工作!如果我使用 Char 类型的 val,为什么它会中断?

【问题讨论】:

标签: scala pattern-matching


【解决方案1】:

您的模式匹配正在创建一个名为 delim 的第二个变量,它会影响第一个变量,并且由于一个新的且未经修饰的变量匹配所有内容,因此这是唯一被执行的 case

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

  case `delim` =>

【讨论】:

  • 另外,final val Delim = ',' 有效。注意 UpperCasefinal.
  • @LuisMiguelMejíaSuárez 大写就足够了。所有vals 都是最终的,你不需要添加它,它是多余的和混乱的。
  • @Dima val 并不意味着该字段是最终的。如果该字段是最终字段,则它不能在子类中被覆盖,而 vals 可以。
  • @KrzysztofAtłasik 是的,我认为这只是一个局部变量。
  • @Dima 在某些情况下,编译器要求 valfinal 以便进行模式匹配。我相信 (虽然不是 100% 肯定) 那是 val 可以被覆盖的时候。所以,我总是使用 final
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-04
  • 2020-08-24
  • 1970-01-01
  • 1970-01-01
  • 2019-06-01
相关资源
最近更新 更多