gpt4 book ai didi

scala - 为什么运营商的变化?

转载 作者:行者123 更新时间:2023-12-01 07:54:56 24 4
gpt4 key购买 nike

长期潜伏者,第一次海报。

在 Scala 中,我正在寻找关于为什么首选根据类型改变运算符的优势。例如,这是为什么:

Vector(1, 2, 3) :+ 4

确定是一个优势:
Vector(1, 2, 3) + 4

或者:
4 +: Vector(1,2,3)

超过:
Vector(4) + Vector(1,2,3)

或者:
Vector(1,2,3) ++ Vector(4,5,6)

超过:
Vector(1,2,3) + Vector(4,5,6)

所以,这里我们有 :+、+: 和++,而只有 + 就足够了。我是 Scala 的新手,我会屈服。但是,对于试图使其语法保持清晰的语言来说,这似乎是不必要的和混淆的。

我已经做了很多谷歌和堆栈溢出搜索,并且只发现了关于特定运算符的问题,以及一般的运算符重载。但是,没有关于为什么有必要将 + 拆分为多个变体的背景。

FWIW,我可以使用隐式类重载运算符,如下所示,但我想这只会导致经验丰富的 Scala 程序员使用/阅读我的代码时产生混淆(和 tisk tisks)。
object AddVectorDemo {

implicit class AddVector(vector : Vector[Any]) {
def +(that : Vector[Any]) = vector ++ that
def +(that : Any) = vector :+ that
}

def main(args : Array[String]) : Unit = {
val u = Vector(1,2,3)
val v = Vector(4,5,6)
println(u + v)
println(u + v + 7)
}
}

输出:

Vector(1, 2, 3, 4, 5, 6)
Vector(1, 2, 3, 4, 5, 6, 7)

最佳答案

答案需要通过差异进行令人惊讶的漫长绕道。我会尽量缩短它。

首先,请注意您可以向现有 Vector 添加任何内容:

scala> Vector(1)
res0: scala.collection.immutable.Vector[Int] = Vector(1)

scala> res0 :+ "fish"
res1: scala.collection.immutable.Vector[Any] = Vector(1, fish)

为什么你能做到这一点?好吧,如果 B extends A我们希望能够使用 Vector[B]哪里 Vector[A]需要,我们需要允许 Vector[B]添加与 Vector[A] 相同的东西可以添加。但一切都扩展了 Any ,所以我们需要允许添加任何 Vector[Any]可以添加,这就是一切。

制作 Vector和大多数其他非 Set 集合协变是一个设计决定,但这是大多数人所期望的。

现在,让我们尝试将向量添加到向量中。
scala> res0 :+ Vector("fish")
res2: scala.collection.immutable.Vector[Any] = Vector(1, Vector(fish))

scala> res0 ++ Vector("fish")
res3: scala.collection.immutable.Vector[Any] = Vector(1, fish)

如果我们只有一个操作, + ,我们将无法指定我们的意思是其中哪一件。我们可能真的想这样做。它们都是非常明智的尝试。我们可以尝试根据类型进行猜测,但实际上最好让程序员明确说出它们的含义。由于有两种不同的含义,因此需要有两种提问方式。

这在实践中会出现吗?是的,一直都有收藏。例如,使用您的 + :
scala> Vector(Vector(1), Vector(2))
res4: Vector[Vector[Int]] = Vector(Vector(1), Vector(2))

scala> res4 + Vector(3)
res5: Vector[Any] = Vector(Vector(1), Vector(2), 3)

那可能不是我想要的。

关于scala - 为什么运营商的变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30674606/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com