使用赋值语法调用方法

时间:2016-07-04 18:39:35

标签: scala syntax

最近我遇到了以下代码:

var l = List("a")
l :+= "b"

第二行非常直观(类似于+=增量),被编译为方法调用和赋值:

l = l :+ "b"

正如我所看到的,它不仅限于库类。例如,这会编译:

trait CustomList[+A] {
  def :+[B >: A](item: B): CustomList[B]
}

var a: CustomList[String] = ...
a :+= "a"

但它显然仅限于符号方法名称:

trait CustomList[+A] {
  def add[B >: A](item: B): CustomList[B]
}

var a: CustomList[String] = ...
a add= "a"

这无法编译(让我们忽略它看起来很糟糕的事实),尽管它看起来一样。

我找不到此功能的文档。所以问题是,这个语法叫什么?关于以<variable> <method-name>= <args>形式调用哪种方法调用<variable> = <variable> <method-name> <args>,有哪些准确的规则(关于命名,方法的优点等)?

1 个答案:

答案 0 :(得分:1)

这是一个名为 Assignment Operators 的Scala功能。

以下是您正在寻找的参考(Scala language spec v2.11, chapter 6, section 12, paragraph 4

  

6.12.4分配运算符

     

赋值运算符是一个运算符符号(标识符中的语法类别op),以等号“=”结尾,但运算符除外,其中包含以下条件之一:

     
      
  • 运算符也以等号开头,或
  •   
  • 运算符是(<=),(>=),(!=)之一。
  •   
     

如果没有其他解释有效,则可以特别处理赋值运算符,因为它们可以扩展为赋值。

     

让我们在中缀操作+=中考虑一个赋值运算符,例如l += r,其中lr是表达式。该操作可以被重新解释为对应于赋值的操作

l = l + r
     

除了操作的左侧l仅评估一次。

     

如果满足以下两个条件,则会重新解释。

     
      
  1. 左侧l没有名为+=的成员,也无法通过隐式转换转换为名为+=的成员的值。
  2.   
  3. 作业l = l + r类型正确。特别地,这意味着l指的是可以分配给的变量或对象,并且可以转换为具有名为+的成员的值。
  4.