7

我正在查看其他人的源代码(Scala),我看到在IndexedSeq:+=类型的变量上调用了运算符。我正在整个 scaladocs 页面中查找该类以弄清楚该运算符的作用,但我没有看到它。我在想它要么是在一个类之外定义的IndexedSeq' 继承层次结构之外的类中定义的,要么是 scaladocs 页面上的 javascript 将它隐藏在我看不到的地方。(实际上两者都不是;请参阅下面的答案。)

我已经点击了 scaladocs 页面上的每个按钮,试图取消隐藏所有内容。我查看了网页的 HTML 代码。必须有一种方法可以从可以应用它的类的文档中查找运算符。没有吗?

注意:我使用symbolhound查找了该运算符,所以我现在知道该运算符的含义。这个问题一般是关于 scala 文档,而不是那个特定的运算符。)

4

2 回答 2

9

Scala 中的所有运算符都是普通方法。

您找不到它,因为它是重新分配的编译器魔术,它不是运算符。或者换一种说法:它看起来像一个自己的运算符,但它实际上是“一个运算符后跟=字符”。

如果运算符(此处)返回正确的类型,编译器将神奇地将其转换为赋值:+,并且原始值var显然是 a 。

由于它不是由任何隐式或显式方法提供的Seq[T],因此它不会出现在生成的 scaladoc 中的任何位置。

所以回答一般问题:

  • 它是一种语言结构,因此唯一记录它的地方就是规范,遗憾的是,
  • 但是,如果您在"<?>="某处发现某个未知运算符,请查找 的定义,该定义"<?>"肯定会记录在案。

编辑:我终于找到了在 SLS 中定义的位置:

§6.12.4:

赋值运算符是以等号字符“=”结尾的运算符符号(语法类别 op in (§1.1)),但满足以下条件之一的运算符除外:

(1) 运算符也以等号字符开头,或

(2) 运算符是 (<=)、(>=)、(!=) 之一。

它后来还说,只有在尝试了所有其他选项(包括潜在的隐含)时才会发生这种情况。

于 2013-07-31T19:51:04.087 回答
1

该值是否分配给变量?如果是这种情况,我认为这种语法糖:

scala> var x = IndexedSeq(1,2,3)
x: IndexedSeq[Int] = Vector(1, 2, 3)

scala> x :+= 10

scala> x
res59: IndexedSeq[Int] = Vector(1, 2, 3, 10)

scala> val y = IndexedSeq(1,2,3)
y: IndexedSeq[Int] = Vector(1, 2, 3)

scala> y :+= 10
<console>:16: error: value :+= is not a member of IndexedSeq[Int]
          y :+= 10
            ^

它是“操作和赋值”的语法糖,例如+=

scala> var x = 10
x: Int = 10

scala> x += 1

scala> x
res63: Int = 11

哪个去糖x = x + 1

于 2013-07-31T19:49:58.233 回答