最近我遇到了以下代码:
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>
,有哪些准确的规则(关于命名,方法的优点等)?
答案 0 :(得分:1)
这是一个名为 Assignment Operators 的Scala功能。
以下是您正在寻找的参考(Scala language spec v2.11, chapter 6, section 12, paragraph 4)
6.12.4分配运算符
赋值运算符是一个运算符符号(标识符中的语法类别
op
),以等号“=”
结尾,但运算符除外,其中包含以下条件之一:
- 运算符也以等号开头,或
- 运算符是(
<=
),(>=
),(!=
)之一。如果没有其他解释有效,则可以特别处理赋值运算符,因为它们可以扩展为赋值。
让我们在中缀操作
+=
中考虑一个赋值运算符,例如l += r
,其中l
,r
是表达式。该操作可以被重新解释为对应于赋值的操作l = l + r
除了操作的左侧
l
仅评估一次。如果满足以下两个条件,则会重新解释。
- 左侧
l
没有名为+=
的成员,也无法通过隐式转换转换为名为+=
的成员的值。- 作业
醇>l = l + r
类型正确。特别地,这意味着l
指的是可以分配给的变量或对象,并且可以转换为具有名为+
的成员的值。