我是Scala的新手。我对 List 类有疑问。这是一个抽象的密封类。这意味着无法实例化,也不能扩展。那么它的用途是什么?像以下这样的东西怎么会起作用?
Top Fade
myList是否将引用List对象作为对象? 另外,如果 productElement 是抽象方法,那么如何实现?
谢谢。
答案 0 :(得分:3)
sealed
表示无法将其扩展到定义它的文件之外。列表是sealed
,但确实在同一文件中定义了2个非抽象子类:Nil
和::
分别代表一个空列表和一个非空列表。
调用List(1,2,3)
时并没有真正实例化List
类。这是List.apply(1, 2, 3)
的语法糖,它正在apply
对象(与List
类一起)上调用List
方法。并且该方法(从技术上说是通过某种间接方式)最终生成Nil
或::
的实例。
您可以在此处查看列表子类: https://github.com/scala/scala/blob/2.13.x/src/library/scala/collection/immutable/List.scala#L547 https://github.com/scala/scala/blob/2.13.x/src/library/scala/collection/immutable/List.scala#L554
您不需要实现它,它是由scala编译器为所有case类创建的。{p>
答案 1 :(得分:2)
关于:
const fruits = [
{ name: 'apple', count: 2 },
{ name: 'apple', count: 4 },
{ name: 'banana', count: 5 },
{ name: 'apple', count: 3 },
{ name: 'apple', count: 4 },
{ name: 'apple', count: 1 },
{ name: 'banana', count: 3 },
{ name: 'apple', count: 1 },
{ name: 'orange', count: 2 }
];
function getReduced(total, {name,count}) {
total[name] = total[name] || {name,count: 0};
total[name].count += count;
return total;
}
let fruitsReduces = Object.values(fruits.reduce(getReduced,{}));
console.log(fruitsReduces);
当编译器遇到一个表达式,该表达式创建了一个没有val myList = List(1,2,3)
修饰符的类实例时,它将查找该类的伴随对象以寻找new
方法。对于列表,它定义为:
.apply
因此,此编译成功。您可以在要求编译器在typer阶段之后发出类型信息时查看以下内容:
override def apply[A](xs: A*): List[A] = xs.toList
myList是否将引用List对象作为对象?
def main(args: Array[String]): Unit = {
val l: List[Int] = scala.collection.immutable.List.apply[Int](1, 2, 3);
()
}
的运行时类型可以是缺点(myList
)或空白列表(::
)。
如果productElement是抽象方法,那么如何实现?
这是一个编译器技巧。 Nil
和productElement
(以及更多)都是在编译时针对任何case类定义生成的。例如,给定以下案例类:
productArity
编译器生成:
case class Bar(i: Int)