【问题标题】:does "r0", "r1" and so on have special meaning in Scala?“r0”,“r1”等在Scala中有特殊含义吗?
【发布时间】:2011-11-09 15:33:59
【问题描述】:

如果我将某些案例对象命名为“r0”、“r1”等,则会出现编译错误。 如果我使用不同的名称,代码将按预期编译和运行。 对此的理性将非常受欢迎!

代码:

package qndTests2

sealed abstract case class Reg()
trait RReg
trait RRegNotPc extends RReg
trait LowReg extends RReg
sealed abstract case class LowRegClass() extends Reg with LowReg
sealed abstract case class RRegNotPcClass() extends Reg with RRegNotPc
case object R0 extends LowRegClass
case object R1 extends LowRegClass
case object R2 extends RRegNotPcClass
case object R3 extends Reg with RReg

sealed abstract case class Base()
trait T1
trait T2 extends T1
trait T3 extends T1
sealed abstract case class CaseClassT3() extends Base with T3
sealed abstract case class CaseClassT2() extends Base with T2
case object r0 extends CaseClassT3
case object r1 extends CaseClassT3
case object r2 extends CaseClassT2
case object r3 extends Base with T1

object test {
  def regToInt(r: RReg): Int = {
    r match{
      case R0 => 0
      case R1 => 1
      case R2 => 2
      case R3 => 3
    }
  }
  def toInt(r: T1): Int = {
    r match{
      case r0 => 0
      case r1 => 1   //error: unreachable code
      case r2 => 2   //error: unreachable code
      case r3 => 3   //error: unreachable code
    }
  }
  def main(args: Array[String]): Unit = {
    println(toInt(r0))
    println(toInt(r1))
    println(regToInt(R0))
    println(regToInt(R3))
  }
}

包“qndTests2”只包含一个文件Test.scala,文件的完整内容如上。 将“r0”~“r3”替换为“A”~“D”,编译成功! 我不知道为什么... 我是不是很累,忽略了一些明显的东西???

【问题讨论】:

  • 为了让它工作,你必须把像r1这样的小写标识符放在反引号中。 case `r1` => ...

标签: scala reserved-words


【解决方案1】:

这不是关于 r0~r3,而是关于小写与大写。看到这个previous question

您的呼叫,无论是错误还是 language spec 的功能,但它都存在,第 8.1.1 节:

变量模式 x 是一个以小写字母开头的简单标识符。它 匹配任何值,并将变量名绑定到该值。

【讨论】:

  • 万一参与 Scala 编译器的人读到:由于这个错误对于初学者来说似乎很常见且高度混乱,如何解释它,或者至少在错误消息中给出提示?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-25
  • 1970-01-01
  • 2016-04-01
相关资源
最近更新 更多