Scala:为什么这个模式匹配代码会抛出IndexOutOfBoundsException异常?

4

我正在查看一个教程,它位于http://www.codecommit.com/blog/scala/scala-for-java-refugees-part-4

这个教程是2008年1月发布的,但我使用的是Scala 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")
}

当输入这段代码到解释器中时,会产生以下错误:

Exception in thread "main" java.lang.IndexOutOfBoundsException at scala.collection.LinearSeqOptimized$class.apply(LinearSeqOptimized.scala:53) at scala.collection.immutable.List.apply(List.scala:45)

还有其他185行的跟踪信息,然后解释器退出。

这个错误消息是什么意思?有谁能告诉我上面的代码有什么问题吗?


确实如此!一些剪切和粘贴显示问题出在“case null”上 - 但是只使用Color类行以及匹配中的case null不会出错。我完全不知道为什么,除了编译器有bug以外。2.8.1已经发布,也许试试那个版本? - The Archetypal Paul
对于我来说,将其作为文件输入到Scala中是可行的,只有逐行交互时会出现问题。 - The Archetypal Paul
感谢确认可以作为编译文件工作。那么,这不是语法问题了吗?我之前遇到过一些其他奇怪的解释器问题。我也以为可能是那行代码的问题 - 我尝试将其更改为 case _ => println("Invalid color"),但这并没有帮助。也许我会尝试使用2.8.1版本,看看是否可能已经修复了这个错误或其他问题。 - JAL
1
最小示例:class A(val a: Int); case class AA(aa: Int) extends A(aa); AA(1) match { case AA(a) => a }。如果你将分号替换为换行符,在REPL中它会失败。使用分号或在周围加上括号,它可以正常运行。 - Debilski
@Debilski 谢谢,我明白你的意思了。确实,当我把这些代码放在一行上,用分号隔开,并将其粘贴到解释器中时,它可以正常工作。为什么不把这个作为答案发出来呢? - JAL
1个回答

3

是的,它退出 REPL 的方式似乎不仅仅是语法错误。谢谢你澄清这个问题。 - JAL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接