在scala 2.10 REPFL中:
>
class E(val i: Int) { def += (other: E) = i - other.i }
implicit def toE(i: Int) = new E(i)
var j = 1
j += 3
结果:
res1: Int = -2
> j
j: Int = 1
请注意,与使用先前的转换方法相比,如果E类本身被标记为隐式,则不会干扰常规+=
。
答案 0 :(得分:3)
如果可以更改此行为,我无法回答,但我在规范中找到了以下说明(第85页):
分配操作符被特别处理,因为它们可以 如果没有其他解释有效,则扩展到作业 。让我们 考虑一个赋值运算符,例如+ = in in fi x operation l + = r,其中l,r是表达式。此操作可以重新解释为 对应于赋值l = l + r
的操作
据此我理解,因为您提供了另一种解释,所以不会进行扩展。 Myabe将有助于追踪问题。
答案 1 :(得分:3)
另一个答案没有引用规范中的整个段落,这是明确的:
如果满足以下两个条件,则会重新解释 实现。 1.左侧l没有名为+ =的成员,也不能通过隐式转换(§6.26)转换为值 一个名为的成员 + =
(另一个条件是它是强制性的。)
当你使类也是隐式的时,你已经定义了两个隐式转换(其中一个是你的toE
),这些转换是模棱两可的,并且被默默地忽略。 (这是各种特征。)
所以你已经回答了自己的问题:关闭隐含的一种方法是使其模糊不清。
另一种方法是遮蔽名称,因为隐式名称必须以其简单名称提供。
肆虐:现在你知道为什么要import scala.language.implicitConversions
。
我想你现在也知道在REPFL [sic]中的F ---代表什么。