为什么大写字母不能用于定义值的模式匹配?

Joh*_*ins 6 scala pattern-matching

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

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

(1, 2) match {
  case (a, bC) => ???
}
Run Code Online (Sandbox Code Playgroud)

并且不能使用大写字母:

/* 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) => ???
}
Run Code Online (Sandbox Code Playgroud)

我正在使用 scala-2.11.17

Ale*_*nov 7

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

val A = 1

2 match {
  case A => true
  case _ => false
} // returns false, because 2 != A
Run Code Online (Sandbox Code Playgroud)

请注意,小写你会得到

val a = 1

2 match {
  case a => true
  case _ => false
} // returns true
Run Code Online (Sandbox Code Playgroud)

因为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) => ...
}
Run Code Online (Sandbox Code Playgroud)

  • 类似的大写有助于案例类:`trait A; 案例类B(v:Int)扩展A; case对象C扩展A; (C:A)匹配{case C =>"object"; 案例B(_)=>"案例类"; case o =>"other"}`.`case o`将编译,`case O`将不会. (2认同)