请帮助解释Scala构造函数和伴生对象的一个案例
我想我在下面对我的问题的解释中会犯一些错误 但在我的理解力有限的情况下,我不知道如何正确地描述这个问题 scala代码如下所示:请帮助解释Scala构造函数和伴生对象的一个案例,scala,pattern-matching,Scala,Pattern Matching,我想我在下面对我的问题的解释中会犯一些错误 但在我的理解力有限的情况下,我不知道如何正确地描述这个问题 scala代码如下所示: sealed trait List[+A] case object Nil extends List[Nothing] case class Cons[+A](head: A, tail: List[A]) extends List[A] object List { def apply[A](as: A*):List[A] = if (as.isEmpty
sealed trait List[+A]
case object Nil extends List[Nothing]
case class Cons[+A](head: A, tail: List[A]) extends List[A]
object List {
def apply[A](as: A*):List[A] =
if (as.isEmpty) Nil
else Cons(as.head, apply(as.tail: _*))
}
如果将对象x创建为:
val x=列表(1,2,3)
我进入同伴对象“列表”,三个数字是:1、2和3
然后,在内部触发函数apply
在构建的时候,这三个数字怎么会有这样的方法/属性:as.head和as.tail
我想这可能是一种模式匹配,但即便如此,我也无法理解数字“as”现在有“.head”和“.tail”的方法/属性的魔力
诀窍在于,
as:A*
是一个变量参数,它被转换为类似数组的对象,实际上是一个WrappedArray$ofInt
。
有head
和tail
方法
您可以扩展List
对象的定义,以查看A*
的类,如下所示:
object List {
def apply[A](as: A*):List[A] = {
println(as.getClass)
if (as.isEmpty) Nil
else Cons(as.head, apply(as.tail: _*))
}
}
有关更详细的解释,请检查,例如..在REPL中尝试此选项
scala> def apply[A](as :A*) = as
apply: [A](as: A*)Seq[A]
因此,编译器将varargs变量
视为,类型为Seq[A]
,这就是.head
和.tail
的来源。。所有规范都保证它是一个Seq
。请不要在任何情况下对as
的类型做出任何假设,除非Seq
@rics:谢谢