2010-11-22 2 views
4

나는 이 튜토리얼 1월에서입니다 http://www.codecommit.com/blog/scala/scala-for-java-refugees-part-4스칼라 :이 패턴이 IndexOutOfBoundsException을 던지는 코드와 일치하는 이유는 무엇입니까?

에서 발견 튜토리얼을 체크 아웃했다. 2008, 나도 알지만, 스칼라 2.8.0을 사용하면 차이가 난다. 인터프리터에이를 입력 할 때

class Color(val red:Int, val green:Int, val blue:Int) 

case class Red(r:Int) extends Color(r, 0, 0) 
case class Green(g:Int) extends Color(0, g, 0) 
case class Blue(b:Int) extends Color(0, 0, b) 

def printColor(c:Color) = c match { 
    case Red(v) => println("Red: " + v) 
    case Green(v) => println("Green: " + v) 
    case Blue(v) => println("Blue: " + v) 

    case col:Color => { 
    print("R: " + col.red + ", ") 
    print("G: " + col.green + ", ") 
    println("B: " + col.blue) 
    } 

    case null => println("Invalid color") 
} 

,이 "주"java.lang.IndexOutOfBoundsException scala.collection.LinearSeqOptimized $ class.apply에서의 스레드

예외를 생성한다 (LinearSeqOptimized.scala 53) scala.collection.immutable.List.apply (List.scala : 45)

에 185 행의 추적을 더하고 인터프리터를 종료합니다.

이 오류 메시지의 의미는 무엇이며, 위의 코드가 잘못된 점은 누구에게 말해 줄 수 있습니까?

+0

그렇습니다! 조금 잘라내어 붙여 넣기를하면 문제가 "case null"이라는 것을 알 수 있습니다. 단, Color 클래스 클래스를 사용하면 일치하는 경우 null 만 오류가되지 않습니다. 왜 컴파일러 버그가 아닌지 모르겠다. 2.8.1이 나오면 시도해 볼 가치가 있습니까? –

+0

그리고 (나를 위해) 그것은 scala에 파일로 공급 될 때 작동합니다. 이는 단지 한 줄에 하나씩 대화식입니다. –

+0

컴파일 된 파일로 작업하는 것에 대해 확인해 주셔서 감사합니다. 구문이 아닌 것 같아요? 나는 전에 통역사와 함께 다른 이상한 문제를 겪었다. 나는 그 라인일지도 모른다고 생각했다. 나는 그것을 case = => println ("Invalid color")'로 바꾸려고 노력했다. 그것은 정말로 내가 생각할 수있는 전부지만, 도움이되지 않는다. 아마 2.8.1을 시험해보고 이것이 아마도 수정 된 버그인지 아닌지를 알아볼 것입니다. – JAL

답변

3

그런 메시지는 항상 버그입니다. 특히 https://lampsvn.epfl.ch/trac/scala/ticket/4025.

+0

예, REPL 자체를 종료하는 방식은 단순한 구문 이상으로 잘못된 것이있는 것처럼 보였습니다. 이 문제를 해결해 주셔서 감사합니다. – JAL

관련 문제