Scala滥用隐式转换

4
在Scala 2.10 REPL中:
>
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不将含义转换为隐式?
2个回答

3
我无法确定这种行为是否可以更改,但我在规范(第85页)中找到了以下描述:
引用: 赋值运算符在处理时有特殊的处理方式,如果没有其他有效的解释,则可以扩展为赋值。 让我们考虑一个赋值运算符,例如在中缀操作l + = r中的+=,其中l,r是表达式。 可以将此操作重新解释为与分配l = l + r相对应的操作。
从中我理解到,因为您提供了替代解释,所以不会发生扩展。这可能有助于追踪问题。

3
另一个答案没有引用规范中的整个段落,其中明确规定:
如果满足以下两个条件,则重新解释: 1.左手边的l没有名为+=的成员,并且也不能通过隐式转换(§6.26)转换为具有名为+=的成员的值。 (另一个条件是进行类型检查。)
当您将类也设置为隐式时,您定义了两个模糊和被忽略的隐式转换(其中之一是您的toE)。 (这是某种特征。)
因此,您已回答了自己的问题:关闭隐式的一种方法是使其模糊。
另一种方法是隐藏名称,因为隐式必须通过其简单名称可用。
对于制造混乱的问题:现在您知道为什么必须导入scala.language.implicitConversions。
我想你现在也知道REPFL [sic]中的F是什么意思了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接