2011-11-09 104 views
4

如果我命名一些案例對象「r0」,「r1」等,我會得到一個編譯錯誤。 如果我使用不同的名稱,代碼將按預期進行編譯和運行。 理性的將是非常值得歡迎的!確實「r0」,「r1」等在Scala中有特殊含義嗎?

的代碼:

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」,編譯! 我不會爲什麼... 我只是很累,俯瞰明顯的東西?

+0

爲了使其正常工作,您必須在反引號中使用小寫字母標識符,例如'r1'。 ''case'r1' => ...'' – Madoc

回答

11

這不是關於r0〜r3,它是關於小寫與大寫。看到這個previous question

你調用它是否是一個錯誤或language spec的功能,但它的存在,第8.1.1節:

變量模式x是簡單的identi網絡呃其以小寫字母開頭。它 匹配任何值,並將變量名稱綁定到該值。

+0

非常感謝,現在一切都清楚了:-) – acapola

+0

如果有人蔘與了Scala編譯器的閱讀:因爲這個錯誤對於初學者來說似乎非常普遍且非常混亂,關於解釋它,或者至少在錯誤消息中給出提示? – acapola

相關問題