Scala DSL:如何添加do”的单词;什么都没有;?
我尝试在Scala DSL:如何添加do”的单词;什么都没有;?,scala,dsl,implicit,Scala,Dsl,Implicit,我尝试在Int上构建一个简单的隐式类,为Int添加一个函数: object Helper { implicit class IntHelper(i: Int) { def add(str: String): Int = i + str.toInt } } 为了更自然地编写,我希望DSL允许这样做(使用import-Helper.\u): 但是我不知道如何执行和功能。我想这个会有用的: object Helper { implicit class IntHelper(i: I
Int
上构建一个简单的隐式类,为Int添加一个函数:
object Helper {
implicit class IntHelper(i: Int) {
def add(str: String): Int = i + str.toInt
}
}
为了更自然地编写,我希望DSL允许这样做(使用import-Helper.\u
):
但是我不知道如何执行和功能。我想这个会有用的:
object Helper {
implicit class IntHelper(i: Int) {
def add(str: String): Int = i + str.toInt
def and: Int = i
}
}
但是如果没有括号,它就不能工作(事实上,“2.add(“3”)和.add(“4”)
可以工作,但是在我看来,DSL有太多的句号和括号)
谢谢问题在于,和
现在被用作后缀符号,这是一般建议不要使用的,因为它创建的正是
(2 add "3" and) add "4"
但是
近似解析为
2.add("3").and(add)."4"
我建议不要使用这种DSL,尤其是刚接触Scala的时候,人们对Scala的表现力很感兴趣,Scala允许使用这种DSL,但你不得不质疑它们的价值
如果您真的想走这条路,可以通过将伪和
方法从后缀变为中缀,添加另一个伪参数,例如然后
,使事情再次“对称”:
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"
这个问题和0描述的完全一样。除了0的解决方案,我还没有看到一种完全没有括号的方法来实现这一点
作为替代方案,这里的版本只需要在链式add
调用周围加括号,这比原始解决方案小,并且不需要额外的关键字:
object Helper {
implicit class IntHelper(i: Int) {
def add(str: String): Int = i + str.toInt
def and(add: AddWord): Int = i + add.str.toInt
}
val add = AddWord
case class AddWord(private[Helper] val str: String)
}
它可以用作:
import Helper._
1 add "3" and add("4") and add("5")
object Helper {
implicit class IntHelper(i: Int) {
def add(str: String): Int = i + str.toInt
def and(add: AddWord): Int = i + add.str.toInt
}
val add = AddWord
case class AddWord(private[Helper] val str: String)
}
import Helper._
1 add "3" and add("4") and add("5")