【问题标题】:+ Operator on lists in Scala+ Scala 中列表上的运算符
【发布时间】:2015-07-20 17:17:09
【问题描述】:

我是 Scala 编程的新手,现在试图了解 scala.collection.immutable.List 运算符 + 的确切行为。这是我写的:

val _1 = List(1, 2)
println((_1 + "2") foreach print

以下内容我写不出来

_1 + 2 //error: expected String

这很清楚,因为我们正在尝试执行在 String 类中定义的 + 运算符。

但不清楚的是,为什么他们不只是为List 覆盖operator +,而是为连接定义operator ++

有什么技术原因吗?

这是什么意思?

【问题讨论】:

  • 我认为将+附加到Strings是Scala作者的设计缺陷。
  • 您所说的“操作员+列表”是什么意思? scala.ollection.immutable.List 不提供+ 运算符。你想要的是:+ 而不是+++
  • @yanana 我知道。这正是我所困惑的。没有为 List 提供覆盖版本的原因是什么?
  • 有一个+ 可以转换成String。所以List首先转换为String,然后是+操作符。
  • 恕我直言,为类似List 的数据结构提供+ 运算符只是一个坏习惯,因为数学中的+ 操作是可交换的,但List 甚至@987654345 @ 不是。

标签: list scala collections


【解决方案1】:

为什么他们不只是覆盖 List 的运算符 +,而是定义运算符 ++ 进行连接?

不采用单个元素而是采用集合的方法通常通过“复数”运算符来表示,例如++ 连接集合,::: 前置列表。例如,+ 方法用于将单个元素添加到非线性集合 SetMap

Set(1, 2, 3) + 4
Map(1 -> "foo", 2 -> "bar") + (3 -> "baz")

在“复数”中:

Set(1, 2, 3) ++ Set(4, 5, 6)

线性集合通过添加冒号表示“方向”,因此:+ 用于追加,+: 用于前置:

1 +: Seq(2, 3) :+ 4

有什么技术原因吗?

没有。可以出于任何原因在任何类型上定义+ 方法。只是不建议这样做。


List(1, 2) + "3" // "List(1, 2)3"

这是 Scala 中常见的谜题。如果右手操作数是String,则使用toString 方法将左操作数隐式转换为另一个String,将两个字符串粘合在一起。

【讨论】:

    猜你喜欢
    • 2013-12-20
    • 2013-09-18
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 2018-08-12
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多