加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala优先考虑隐式转换而不是“自然”操作……为什么?这是一个

发布时间:2020-12-16 09:03:36 所属栏目:安全 来源:网络整理
导读:当然,这个简单的测试按预期工作: scala var b = 2b: Int = 2scala b += 1 scala bres3: Int = 3 现在我将其纳入范围: class A(var x: Int) { def +=(y:Int) { this.x += y } }implicit def int2A(i:Int) : A = new A(i) 我正在为它定义一个新类和一个=操作
当然,这个简单的测试按预期工作:

scala> var b = 2
b: Int = 2

scala> b += 1   

scala> b
res3: Int = 3

现在我将其纳入范围:

class A(var x: Int) { def +=(y:Int) { this.x += y } }
implicit def int2A(i:Int) : A = new A(i)             

我正在为它定义一个新类和一个=操作,并且当我想要将Int添加到A的Int值时,这是一个方便的隐式转换.

当“A”类不是表达式的所有部分时,我从未预料到这会影响我的常规Int操作的行为方式.

但它确实:

scala> var b:Int = 0
b: Int = 0

scala> b += 1

scala> b  
res29: Int = 0

scala> b += 2

scala> b
res31: Int = 0

这里似乎发生的是b:Int被隐式转换为“A”,它不绑定到任何变量,然后在其上调用=,丢弃结果.

Scala似乎高度优先于已经定义为Ints的自然=行为(编译器魔法,而不是实际方法)的隐式转换.常识以及C背景告诉我,只有在编译失败时才应该作为最后的手段调用implicits.这导致了几个问题……

>为什么?这是一个错误吗?它是按设计的吗?
>是否有解决办法(除了不使用“=”用于我的DSL的“=”操作)?

谢谢

解决方法

即使遭到Eastsun的解释,似乎这是一个错误,它应该在尝试隐式转换为=之前尝试b = b 1转换.

请通过发送电子邮件至scala-user@listes.epfl.ch或访问n4.nabble.com/Scala-User-f1934582.html,将此问题提交给scala用户电子邮件列表.如果它是一个错误,那就是它会被注意到并修复的地方.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读