Scala中infix中缀函数是否支持传入额外参数?
结论
你最初的判断是正确的:Scala原生不支持a op(additionalParam) b这种形式的中缀调用语法。
Scala的中缀调用规则仅允许单参数方法使用a 方法名 b的写法,等价于a.方法名(b),没有预留在方法名和第二个操作数之间插入额外参数的语法位置。
可实现的替代方案(满足向op传递额外数值参数的诉求)
方案1:柯里化方法+点调用
将op方法定义为多参数列表的柯里化形式,调用写法接近你预期的结构:// 方法定义示例 extension (a: Int) def op(extra: Int)(b: Int): Int = a + extra * b // 调用形式 val res = a.op(additionalParam)(b)方案2:借助中间代理类实现近预期写法
定义中间承载类传递左操作数和额外参数,再通过中缀方法接收右操作数,调用形式仅比你预期多一个连接符号:// 中间代理类 class OpHolder(val left: Int, val extra: Int) { infix def apply(right: Int): Int = left + extra * right // 也可以自定义中缀符号,比如`@` infix def `@`(right: Int): Int = left + extra * right } extension (a: Int) infix def op(extra: Int): OpHolder = OpHolder(a, extra) // 调用形式1,用apply省略方法名 val res1 = a op(additionalParam) (b) // 调用形式2,用自定义中缀符号 val res2 = a op(additionalParam) @ b方案3:多参数中缀调用
如果你可以接受把额外参数和右操作数放在一起,直接定义多参数方法即可,Scala支持多参数的中缀调用,所有参数放在括号里即可:extension (a: Int) infix def op(b: Int, extra: Int): Int = a + extra * b // 调用形式 val res = a op (b, additionalParam)
内容的提问来源于stack exchange,提问作者Tschösi
相关产品推荐
相关产品推荐

