如何找到隐式转换类中定义的方法/操作的定义?

时间:2013-07-31 19:28:35

标签: scala

我正在查看其他人的源代码(Scala),其中我看到在IndexedSeq类型的变量上调用运算符:+=。我正在查看该类的scaladocs页面以找出该运算符的作用,但我没有看到它。我认为它是在IndexedSeq的继承层次结构之外的类中定义的,否则scaladocs页面上的javascript将它隐藏在某个我无法看到的地方。 (实际上它既不是;见下面的答案。)

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

NB :我使用symbolhound查找了该运算符,因此我知道该运算符现在意味着什么。这个问题一般是关于scala文档,而不是特定的运算符。)< / p>

2 个答案:

答案 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