Scala中的DSL是什么?
通过各种Scala相关的材料,术语DSL在许多地方被使用 谷歌搜索告诉我们它是特定领域的语言Scala中的DSL是什么?,scala,dsl,Scala,Dsl,通过各种Scala相关的材料,术语DSL在许多地方被使用 谷歌搜索告诉我们它是特定领域的语言 它到底是什么意思,为什么在学习其他语言(如Java)时,这个术语没有出现?正如其他人所指出的,问题的第一部分(“什么是DSL?”)基本上由 我将尝试回答第二部分:为什么DSL在Scala中如此流行 原因是Scala(与Java等其他语言不同)提供了许多语法工具来提供DSL 例如,Scala有中缀方法应用程序: someObject.someMethod(someArgument) // can be
它到底是什么意思,为什么在学习其他语言(如Java)时,这个术语没有出现?正如其他人所指出的,问题的第一部分(“什么是DSL?”)基本上由 我将尝试回答第二部分:为什么DSL在Scala中如此流行 原因是Scala(与Java等其他语言不同)提供了许多语法工具来提供DSL 例如,Scala有中缀方法应用程序:
someObject.someMethod(someArgument)
// can be written as
someObject someMethod someArgument
这使得在语言中引入自定义“运算符”非常容易。一个值得注意的例子是向参与者发送消息的DSL:
actor ! message
这是一个模仿Erlang语法的DSL
Scala中的另一个语法工具示例是“尾部块参数”(不确定它是否有精确的名称):
当最后一个参数是函数时,这非常有趣:
def someOtherMethod[A, B](x: A)(f: A => B): B = ???
someOtherMethod(42) { a =>
// ...a very long body
}
在其他语言中,块({…}
)通常保留给内置的控制流结构(例如if
,while
,for
,等等),但在Scala中,您可以使用此语法工具构建类似内置控制结构的自定义方法
仅这两个特性就足以解释为什么DSL在Scala社区如此普及
再深入一点,我们还可以提到隐式转换,它允许向任何现有类型添加自定义方法。比如说
implicit class TimesOps(x: Int) {
def times(y: Int): Int = x * y
}
// then use as
2 times 4 // 8
本例结合了中缀方法应用程序和隐式转换的使用。Java中有大量DSL,这可能是重复的。我们无法告诉您为什么在学习Java时没有遇到它们。SQL是查询关系数据的DSL,通常与Java一起使用。HTML是一种DSL,用于描述超媒体文档的语义结构,在Web应用程序中经常与Java一起使用。Ant是构建系统中面向任务编程的DSL,通常用于构建Java程序。JUnit是用Java编写单元测试的DSL。Drools、Gradle、ApacheCamel等等。以JUnit为例,我认为它是一个测试框架。框架是DSL的一个例子吗?这难道不是语法糖吗?如果不是的话,是什么让DSL和语法糖@Gabriele PetronellaThese看起来很好,但我觉得很多时候它只是增加了scala的学习曲线,这阻止了它成为主流语言,如java和python
implicit class TimesOps(x: Int) {
def times(y: Int): Int = x * y
}
// then use as
2 times 4 // 8