Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala DSL:如何添加do”的单词;什么都没有;?_Scala_Dsl_Implicit - Fatal编程技术网

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")