【问题标题】:How does the Seq shorthand for Scala actually work?Scala 的 Seq 简写实际上是如何工作的?
【发布时间】:2018-09-15 01:49:40
【问题描述】:

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

Seq(1, 2, 3)

并获得一个包含元素 1、2、3 的新列表。

但是 Seq 是一种抽象吗?没有new 关键字。那么这个魔法是如何发挥作用的呢?

【问题讨论】:

    标签: scala


    【解决方案1】:

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

    这是一个简单的类Foo的示例

    class Foo { }
    object Foo {
        def apply() = new Foo
    }
    

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

    val myFooWNew = new Foo
    val myFooWONew = Foo()
    

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

    case class Bar { }
    

    您可以通过两种方式创建对象:

    val myBarWNew = new Bar
    val myBarWONew = Bar()
    

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

    实际上,Seq 构造有点复杂,其中包含GenSeqFactory 和许多其他类。

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

    【讨论】:

    • val myFooWONew = Foo。不,这会将伴随对象本身分配给myFooWONew。你需要= Foo()
    猜你喜欢
    • 2021-01-21
    • 2011-09-27
    • 2021-12-16
    • 2013-03-14
    • 2021-03-23
    • 2011-02-11
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多