gpt4 book ai didi

Scala DSL : How to add words that do "nothing"?

转载 作者:行者123 更新时间:2023-12-05 00:18:59 24 4
gpt4 key购买 nike

我尝试在 Int 上构建一个简单的隐式类为 Int 添加一个函数:

object Helper {
implicit class IntHelper(i: Int) {
def add(str: String): Int = i + str.toInt
}
}

为了更自然地编写,我希望 DSL 允许这样做(使用 import Helper._ ):
2 add "3" and add "4"

但我不知道如何做 and功能。我认为这个会起作用:
object Helper {
implicit class IntHelper(i: Int) {
def add(str: String): Int = i + str.toInt
def and: Int = i
}
}

但如果没有括号它就不起作用(确实, "2.add("3").and.add("4") 有效,但我认为 DSL 有太多句号和括号)。

谢谢

最佳答案

问题在于 and现在用作后缀表示法,通常不建议这样做,因为它正好创建了 problem with delimiting the expression .所以你可以写

(2 add "3" and) add "4"


2 add "3" and add "4"

近似解析为
2.add("3").and(add)."4"

我建议不要使用这种 DSL。尤其是在刚接触 Scala 时,人们对 Scala 允许使用此类 DSL 的表现力很感兴趣,但您必须认真质疑它们的值(value)所在。

如果你真的想走这条路,你可以通过转动假人让事物再次“对称” and从后缀到中缀的方法,添加另一个虚拟参数,例如 then :
object Helper {
implicit class IntHelper(i: Int) {
def add(str: String): Int = i + str.toInt
}

implicit class AndThen[A](in: A) {
def and(t: then.type): A = in
}

object then
}

import Helper._

2 add "3" and then add "4"

关于Scala DSL : How to add words that do "nothing"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36813985/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com