当我手动将 Scala 2 代码转换为 Scala 3 时,我的 DSL 的运算符优先级发生了变化,我花了很长时间来调试和修复。似乎处理:
方式不同:
extension (i1: Int) def ~>:(i2: Int) = i1 < i2
extension (i1: Int) def ~>(i2: Int) = i1 < i2
class Wrap(val i: Int):
def ~>:(w: Wrap) = i ~>: w.i
def ~>(w: Wrap) = i ~> w.i
// `Wrap` preserves `~>`
println(1 ~> 2) // true
println(Wrap(1) ~> Wrap(2)) // true
// `Wrap` does not preserve `~>:`
println(1 ~>: 2) // true
println(Wrap(1) ~>: Wrap(2)) // false
我的心智模型是:
- 对于以 结尾的方法
:
,接收者是右边的东西 - 扩展方法只是方法:就好像方法被添加到类中一样
我的心理模型似乎是错误的。解释正在发生的事情的正确方法是什么?
链接会有所帮助,我检查了 Scala 3 文档并没有找到任何关于自定义运算符如何关联的信息。
更新
我尝试infix
在之前添加关键字def
,但它不会更改此示例中打印的内容。