首页 > 解决方案 > 请帮忙解释一个Scala构造函数和伴生对象的案例

问题描述

我认为我会在下面对我的问题的解释中犯一些错误,但在我的理解范围内,我无法弄清楚如何正确描述这个问题

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) Nil
    else Cons(as.head, apply(as.tail: _*))
}

如果我将对象 x 创建为: val x = List(1,2,3)

我传入伴随对象“List”,三个数字为:1,2 和 3 然后,在内部,函数 apply 被触发在构造的那一刻,这三个数字怎么可能具有方法/属性,例如:as.head 和 as.tail

我想这可能是一种模式匹配,但即便如此,我还是无法理解数字“as”现在具有“.head”和“.tail”的方法/属性的魔力

在此处输入图像描述

标签: scalapattern-matching

解决方案


在 REPL 中试试这个。

scala> def apply[A](as :A*) = as
apply: [A](as: A*)Seq[A]

所以编译器认为 varargs 变量 ,as的类型Seq[A]是 ,这就是.headand.tail的来源。


推荐阅读