当您使用 Seq(1,2,3) 创建 Seq 对象时会发生什么?

2023-12-10

当您评估表达式时到底会发生什么:Seq(1,2,3)?

我是 Scala 新手,现在对各种集合类型有点困惑。Seq是一种特质,对吗?所以当你这样称呼它时:Seq(1,2,3),它一定是某种伴生对象吗?或不?它是某种扩展的类吗Seq?最重要的是,返回值的类型是什么?是吗Seq如果是,为什么不明确地使用扩展类?

同样在 REPL 中,我看到计算表达式的内容实际上是List(1,2,3),但类型显然是Seq[Int]。为什么它不是一个IndexedSeq集合类型,例如Vector?这一切背后的逻辑是什么?


当你计算表达式时到底会发生什么:Seq(1,2,3)?

在斯卡拉中,foo(bar)是语法糖foo.apply(bar), 除非this还有一个名为foo,在这种情况下,它是隐式方法调用this接收者,即就像Java一样,它相当于this.foo(bar).

就像任何其他 OO 语言一样,方法调用的接收者alone决定如何处理该调用,因此在这种情况下,Seq决定要做什么。

Seq 是一种特质,对吗?

那里有两个Seq标准库中的s:

  • The trait Seq,这是一个type.
  • The object Seq,这是一个value.

所以当你这样称呼它时Seq(1,2,3)它一定是某种伴生对象吗?或不?

是的,它必须是一个对象,因为您只能调用对象上的方法。您无法调用类型上的方法,因此,当您看到方法调用时,它must成为一个物体。总是。所以,在这种情况下,Seq 不可能 be the Seq特质,一定是Seq object.

请注意,“它必须是某种伴生对象”是不正确的。从那段代码中你唯一能看到的是Seq是一个对象。您无法从该代码段知道它是否是伴生对象。为此,您必须查看源代码。在这种特殊情况下,事实证明is,事实上,一个伴随对象,但您无法从您显示的代码中得出结论。

它是某种扩展 Seq 的类吗?

No. It 不可能是一个类,因为你只能调用对象的方法,而类不是 Scala 中的对象。 (这与 Ruby 或 Smalltalk 不同,其中类也是对象和实例Class类。)它must成为一个物体。

最重要的是返回值的类型是什么?

找出这一点的最简单方法就是简单地查看Seq.apply 的文档:

def apply[A](elems: A*): Seq[A]

创建具有指定元素的集合。

  • A:集合元素的类型
  • elems:创建的集合的元素
  • returns包含元素 elems 的新集合

所以,正如你所看到的,返回类型Seq.apply is Seq,或更准确地说,Seq[A], where A是一个类型变量,表示集合元素的类型。

是 Seq 吗?如果是,为什么不显式地使用扩展类?

因为没有扩展类。

此外,Scala 中的标准设计模式是apply伴生对象的方法返回伴生类或特征的实例。打破这个惯例将会是奇怪和令人惊讶的。

同样在 REPL 中,我看到计算表达式的内容实际上是一个 List(1,2,3),但类型显然是 Seq[Int]。

The 静态类型 is Seq[Int]。这就是您需要知道的全部。这就是你的全部can know.

Now, Seq is a trait,并且特征无法实例化,因此运行时类型将是某个子类Seq。但!您不能也不能关心它是什么特定的运行时类型。

为什么不是像 Vector 这样的 Indexed 集合类型?这一切背后的逻辑是什么?

你怎么知道它不会返回Vector下次你打电话的时候吗?这一点都不重要,因为静态类型是Seq因此你只能打电话Seq方法,并且您只能依赖于合同Seq, i.e. Seq无论如何,后置条件、不变量等等。甚至if你知道这是一个Vector返回后,您将无法利用这些知识做任何事情。

Thus, Seq.apply返回它可能返回的最简单的东西,那就是List.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当您使用 Seq(1,2,3) 创建 Seq 对象时会发生什么? 的相关文章

  • 从会话中读取数据时如何发出加特林捕获请求?

    根据加特林文档 http gatling io docs 2 1 7 session session api html 我可以在执行场景时使用会话属性 但是 每次我在场景中使用函数文字访问会话时 都会遇到以下异常 error java la
  • 内存泄漏在哪里?

    我使用 InetAddress 来解析 IP 地址 但现在如果 IP 不可用 则需要存储主机名 所以我介绍了一个班级Host case class Host name String ip InetAddress import Host ad
  • 用 HashMap[Int, Vector[Int]] (Scala) 表示图(邻接列表)?

    我想知道如何 如果可能的话 我可以通过以下方式制作 可变 图的邻接列表表示HashMap Int Vector Int HashMap当然是可变的 目前我将其设置为HashMap Int ArrayBuffer Int 但我可以更改 Arr
  • Scala 条件列表构造

    我正在使用 Scala 2 9 2 并且想根据某些条件构建一个列表 考虑以下情况 其中 cond 是采用谓词 p 和类型 T 的值 在本例中为 t3 的某个函数 t1 t2 cond p t3 t4 我想要的行为如下 如果 p 为真 则应给
  • Spark Streaming 中是否需要检查点

    我注意到 Spark 流示例也有检查点代码 我的问题是检查点有多重要 如果是为了容错 那么在此类流应用程序中发生故障的频率是多少 这一切都取决于您的用例 假设您正在运行一个流作业 它仅从 Kafka 读取数据并计算记录数 如果您的应用程序在
  • Scala 中缺少多重集吗?

    我正在尝试 Scala 中的 Facebook Hacker Cup 2013 资格赛问题 对于第三个问题 我觉得需要一个有序的 Multiset 但在 scala 的 2 10 集合中找不到一个 scala 的集合中是否缺少此数据结构 会
  • 在 Spark 中将多行汇总为单行和单列

    我有一个如下的火花 DF 我需要汇总具有与单行相同 ID 的多行 但值应该不同 id values 1 hello 1 hello Sam 1 hello Tom 2 hello 2 hello Tom 预期输出 id values 1 h
  • akka-http:找不到参数解组的隐式值

    我的 Spray json 支持看起来像这样 object MarshallingSupport extends SprayJsonSupport implicit def json4sFormats Formats DefaultForm
  • 如何在Scala中表达这个类型?存在类型类(即隐式)限制吗?

    我正在使用 Play 框架的 JSON 库 它使用类型类来实现Json toJson功能 http www playframework org documentation api 2 0 4 scala index html play ap
  • Scala 中的行聚合

    我正在寻找一种方法在 Scala 的数据框中获取一个新列来计算min max中的值col1 col2 col10对于每一行 我知道我可以使用 UDF 来做到这一点 但也许有一种更简单的方法 Thanks Porting 这个Python答案
  • Scala 功能设计模式目录

    一周以来我一直在阅读 Scala 编程 作者一步一步地介绍了该语言的元素 但我仍然很困惑何时使用演员 闭包 柯里化等功能性的东西 我正在寻找功能结构的典型用例或最佳实践的目录 我并不是说在 Scala 中重新实现像 GoF 这样的众所周知的
  • 错误:无法在 scala 中找到或加载主类

    安装 eclipse scala 插件和 eclipse maven scala 插件后 我是 scala 新手 所以我尝试确保在测试 scala hello world 项目后环境正常工作 它按预期工作 但我在尝试执行我从公司存储库中签出
  • SBT 对 Scala 类型感到困惑

    SBT 抛出以下错误 value split is not a member of String String error filter arg gt arg split delimiter length gt 2 对于以下代码块 impl
  • 为二叉树实现 IntoIterator

    我正在尝试构建一棵二叉树并编写一个迭代器来遍历树中的值 当为我的树节点实现 IntoIterator 特征时 我遇到了生命周期问题 src main rs 43 6 43 8 error the lifetime parameter a i
  • Scala 中用于阻止调用的 Future

    The Akka文档说 you may be tempted to just wrap the blocking call inside a Future and work with that instead but this strate
  • SBT插件——编译前执行自定义任务

    我刚刚编写了我的第一个 SBT 自动插件 它有一个生成设置文件的自定义任务 如果该文件尚不存在 当显式调用任务时 一切都会按预期工作 但我希望在使用插件编译项目之前自动调用它 无需项目修改其 build sbt 文件 有没有办法实现这一点
  • Map 和 Set 的实际类(不是抽象类,也不是特征类)是什么?

    在 Scala 中 映射和集合文字可以通过以下方式创建 val m Map 1 gt a 以及引用的类型m字面意思都是Map Int String 然而 scala文档表明Map实际上是一个特征 具有需要实现才能实例化的抽象成员 scala
  • 在 AKKA 中,对主管调用 shutdown 是否会停止其监督的所有参与者?

    假设我有一位主管连接了 2 位演员 当我的应用程序关闭时 我想优雅地关闭这些参与者 调用supervisor shutdown 是否会停止所有参与者 还是我仍然需要手动停止我的参与者 gracias 阻止主管 https github co
  • 如何在不消耗值的情况下实现添加特征[重复]

    这个问题在这里已经有答案了 当实施Add特质 还有其他一些 比如Mul Sub等 对于一个简单的结构体 必须完全消耗该结构体值 因此它的后续使用是不可能的 同时 内置原语 u8 usize等 实施Add同时允许之后使用它add被称为 我该如
  • 如何通过数据框中数组列的索引计算平均值

    我正在使用 Spark 2 2 我有一个关于合作的基本问题ArrayType 我没有找到可以使用的内置聚合函数 Given a DataFrame有一个柱子id和一列values of ArrayType 我们想按 id 分组 然后按索引计

随机推荐