scala abusive隐式转换

时间:2013-08-09 15:13:15

标签: scala override implicit-conversion

在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类本身被标记为隐式,则不会干扰常规+=

哇,如果这个隐式转换在范围内,我已经能够完全破坏程序了!如果意义已经存在,有没有办法让scala不转换为implicits?

2 个答案:

答案 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 ---代表什么。