scala - 请帮忙解释一个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”的方法/属性的魔力
解决方案
在 REPL 中试试这个。
scala> def apply[A](as :A*) = as
apply: [A](as: A*)Seq[A]
所以编译器认为 varargs 变量 ,as
的类型Seq[A]
是 ,这就是.head
and.tail
的来源。
推荐阅读
- javascript - 基于 HTML5/NodeJS 的实时音频流
- time - 对计算机使用 for 循环是否比重复指令更快?
- java - Kafka poll 和 max.poll.interval.ms - 批处理最佳实践
- python - 读取并合并具有不同列的多个 csv 文件
- sql - Aggregate expression issue with GROUPBY
- jquery - 从signalR动态加载的Jquery数据表
- c# - EF6 包括实体中集合的引用
- entity-framework - 扩展自动生成的招摇文档以包含特定的端点?
- python - 为什么用 Python 重写辛普森的积分规则会给出不同的结果?
- json - Golang 将 S3 中的 JSON 读入内存中的 struct