什么是Scala中的DSL?

时间:2018-03-11 03:22:05

标签: scala dsl

通过各种Scala相关材料,术语DSL在很多地方使用。

谷歌搜索告诉它是特定于域的语言。

究竟是什么意思,为什么在学习Java之类的其他语言时,这个术语并没有出现?

1 个答案:

答案 0 :(得分:8)

正如其他人所指出的那样,问题的第一部分(“什么是DSL?”)基本上由What is a DSL and where should I use it?

回答。

我将尝试回答第二部分:为什么DSL在Scala中如此受欢迎?

原因是Scala(与Java等其他语言相对)提供了许多提供DSL的语法功能。

例如,Scala有中缀方法应用程序:

someObject.someMethod(someArgument)

// can be written as

someObject someMethod someArgument

这使得在语言中引入自定义“操作符”非常容易。一个值得注意的例子是用于向演员发送消息的akka DSL:

actor ! message

这是一个模仿Erlang语法的DSL。

Scala中语法设施的另一个例子是“尾随块参数”(不确定它是否有一个精确的名称):

def someMethod(x: Int)(y: String) = ???

// can be invoked as
someMethod(42)("foo")

// but also as
someMethod(42) { "foo" }

当最后一个参数是函数时非常有趣:

def someOtherMethod[A, B](x: A)(f: A => B): B = ???

someOtherMethod(42) { a =>
  // ...a very long body
}

在其他语言中,块({ ... })通常保留给内置控制流结构(例如ifwhilefor等),但是在Scala中,您可以使用这种语法功能来构建类似于内置控制结构的自定义方法。

仅凭这两个特征就足以解释为什么DSL在Scala社区中如此普遍。

深入挖掘,我们还可以提到隐式转换,它允许向任何现有类型添加自定义方法。例如

implicit class TimesOps(x: Int) {
  def times(y: Int): Int = x * y
}

// then use as

2 times 4 // 8

此示例结合使用中缀方法应用程序和隐式转换。