我正在查看其他人的源代码(Scala),其中我看到在IndexedSeq类型的变量上调用运算符:+=
。我正在查看该类的scaladocs页面以找出该运算符的作用,但我没有看到它。我认为它是在IndexedSeq
的继承层次结构之外的类中定义的,否则scaladocs页面上的javascript将它隐藏在某个我无法看到的地方。 (实际上它既不是;见下面的答案。)
我点击了scaladocs页面上的每个按钮,试图取消隐藏所有内容。我查看了网页的HTML代码。必须有一种方法可以从可以应用它的类的文档中查找运算符。不在吗?
( NB :我使用symbolhound查找了该运算符,因此我知道该运算符现在意味着什么。这个问题一般是关于scala文档,而不是特定的运算符。)< / p>
答案 0 :(得分:9)
Scala中的所有运算符都是常规方法。
你无法找到它,因为它是编译器魔法用于重新分配,它是不运算符。或者用另一种方式说:它看起来像是一个自己的运算符,但它实际上是“一个运算符后跟=
字符”。
如果运算符(此处为:+
)返回正确的类型,并且原始值明显为var
,编译器会神奇地将其转换为赋值。
由于Seq[T]
或其他任何隐式或显式方法都没有提供它,因此它不会出现在生成的scaladoc中的任何位置。
所以回答一般问题:
"<?>="
未知运算符,请查找"<?>"
的定义,确定要记录一下。编辑:我终于找到了SLS中定义的位置:
§6.12.4:
赋值运算符是一个运算符符号((§1.1)中的语法类别op) 以等号“=”结尾,但运算符除外 以下条件成立:
(1)运算符也以等号开头,或
(2)运算符是(&lt; =),(&gt; =),(!=)之一。
稍后也会说,只有在尝试了所有其他选项(包括潜在的暗示)时才会发生这种情况。
答案 1 :(得分: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
。