Scala的Seq简写实际上如何工作?

时间:2018-04-05 09:36:00

标签: scala

在Scala中,Seq是一个与Java中的List松散对应的特征。 但是,在Scala中可以这样做:

for (let i = 999; i > 0; i--) {
  var j=i;
  var k=i;
  var m=i;
 // do_something_here
}

并获取包含元素1,2,3的新列表。

但是Seq是一个抽象?没有Seq(1, 2, 3) 个关键字。那么这个魔法是如何起作用的呢?

1 个答案:

答案 0 :(得分:3)

您可以通过两种方式从Scala中的常规类创建对象,可以使用或不使用new关键字。通过省略它,您将在类的companion object上调用apply方法。

以下是一个简单的类Foo

的示例
class Foo { }
object Foo {
    def apply() = new Foo
}

您可以通过以下方式创建Foo对象:

val myFooWNew = new Foo
val myFooWONew = Foo()

如果您有一个案例类,那么在定义案例类时,会隐式为您创建伴随对象及其apply方法。

case class Bar { }

你可以用两种方式创建对象:

val myBarWNew = new Bar
val myBarWONew = Bar()

这对非抽象类有效。正如你所说的,Seq是一个特征,它缺少一个构造函数,所以它的实现(大致)总是在伴随对象中。

实际上,Seq构造稍微复杂一些,内部有GenSeqFactory和许多其他类。

还有一个List类,更像是Java中的LinkedList。关于Scala here中的SeqList有一个很棒的答案。