【问题标题】:Why can't upper-case letters be used for pattern matching for define values?为什么大写字母不能用于定义值的模式匹配?
【发布时间】:2016-02-05 15:50:11
【问题描述】:

为什么我可以使用小写字母:

val (a, bC) = (1, 2)

(1, 2) match {
  case (a, bC) => ???
}

并且不能使用大写字母:

/* compile errors: not found: value A, BC  */
val (A, BC) = (1, 2)

/* compile errors: not found: value A, BC  */
(1, 2) match {
  case (A, BC) => ???
}

我正在使用scala-2.11.17

【问题讨论】:

    标签: scala pattern-matching


    【解决方案1】:

    因为 Scala 的设计者更喜欢允许像这样使用以大写字母开头的标识符(并且允许两者都会混淆):

    val A = 1
    
    2 match {
      case A => true
      case _ => false
    } // returns false, because 2 != A
    

    请注意,使用小写您会得到

    val a = 1
    
    2 match {
      case a => true
      case _ => false
    } // returns true
    

    因为case a 绑定了一个名为a 变量。

    一个很常见的情况是

    val opt: Option[Int] = ...
    
    opt match {
      case None => ... // you really don't want None to be a new variable here
      case Some(a) => ...
    }
    

    【讨论】:

    • 类似地,大写有助于案例类:trait A; case class B(v: Int) extends A; case object C extends A; (C: A) match { case C => "object"; case B(_) => "case class"; case o => "other" }case o 会编译,case O 不会。
    • 可能还值得一提的是,如果您在第二个示例中遇到小写名称,您可以通过在名称周围加上反引号来使其工作:case `a` => true
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多