我正在学习Scala.
我很困惑scala不可变List中的head是方法或字段值.
列表声明如下.
sealed abstract class List[+A] extends .... {
def isEmpty: Boolean
def head: A //I think it is field value not a function or method
def tail: List[A]
Run Code Online (Sandbox Code Playgroud)
但是,intelliJ说这是方法.
究竟是什么?
List是一个抽象类,def head这里是一个抽象方法,因此声明和IJ都是正确的.
在非空的列表实例中,即::它实现如下:
final case class ::[B](override val head: B, private[scala] var tl: List[B]) extends List[B] {
override def tail : List[B] = tl
override def isEmpty: Boolean = false
}
Run Code Online (Sandbox Code Playgroud)
因此,字段 head用于实现抽象方法 head.这在Scala中是合法的:val与无参数之间没有太大区别def,您可以以二进制兼容的方式在一个和另一个之间进行更改.
在列表的空实例中,Nil实现此方法以引发异常:
case object Nil extends List[Nothing] {
override def head: Nothing =
throw new NoSuchElementException("head of empty list")
/*...*/
}
Run Code Online (Sandbox Code Playgroud)
一个字段不能"抛出异常",但一种方法显然可以.
| 归档时间: |
|
| 查看次数: |
136 次 |
| 最近记录: |