【发布时间】:2017-06-06 01:18:15
【问题描述】:
刚开始使用 Scalavar c = 0c += 1 工作c.+= 给了我error: value += is not a member of Int
+= 是在哪里定义的?
【问题讨论】:
刚开始使用 Scalavar c = 0c += 1 工作c.+= 给了我error: value += is not a member of Int
+= 是在哪里定义的?
【问题讨论】:
Section 6.12.4 Assignment Operators of the Scala Language Specification (SLS) 解释了这种复合赋值运算符是如何脱糖的:
l ω= r
(其中ω 是除<、>、! 之外的任何运算符字符序列,并且不以= 开头)被脱糖为
l.ω=(r)
IFF l 有一个名为 ω= 的成员,或者可以隐式转换为一个具有名为 ω= 的成员的对象。
否则,它会被脱糖
l = l.ω(r)
(l 除外,保证只计算一次),如果类型检查的话。
或者,更简单地说:编译器将首先尝试l.ω=(r),如果不起作用,它将尝试l = l.ω(r)。
这允许像 += 这样的东西像在其他语言中一样工作,但仍然被覆盖以做不同的事情。
【讨论】:
实际上,您描述的代码确实有效。
scala> var c = 4
c: Int = 4
scala> c.+=(2) // no output because assignment is not an expression
scala> c
res1: Int = 6
我怀疑(但不能肯定地说)它在库中找不到,因为编译器将其去除(重写)为 c = c.+(1), 在图书馆。
【讨论】:
c. 时,我得到了一个可能完成的菜单,但 += 不在其中。
+=。
scalac -Xlog-implicit-conversions test.scala,但没有任何迹象表明发生了隐式转换。