有没有办法创建一个scala dsl,它可以让我编写类似于这个伪代码的代码
已编辑:已更改为scala伪代码
object AccessProtectedClass extends App{
def protectedMethod(param:String)
permit_if (param.startsWith("asdf") and RAM <= 10) : Int = {
var result = 10
//do something
return result;
}
}
如果由于'permit if'语句而未授予访问权限,则应抛出异常。 我需要哪些scala概念?
答案 0 :(得分:3)
可以编写与此类似的代码。你必须记住两件事:
obj method param method param method param...
,因此您必须在适当的位置放置方法名称的关键字。<=
的优先级高于and
,这将有助于您展示的代码段。点符号也是如此。作为对象的apply方法,对象后面的括号也会获得更高的优先级,例如Specs2可以很好地使用它。所以,回到这个:
permit if param.startsWith("xyz") and CPU <= 50 { ... }
我们可以这样打破它:
permit // object
if // method, though "if" is a reserved word, so you have to pick something else
param.startsWith("xyz") // param, because of higher precedence
and // method
CPU <= 50 // param, because of higher precedence
// method needed here!
{ ... } // param
所以它看起来好像构建器模式在这里工作,只需稍作调整。 and
(或任何or
)的参数可能是按名称,因此如果结果由前者定义,则可以避免评估后面的条件。
答案 1 :(得分:1)
如果我理解正确,基本上permit_if
方法只需要一个条件和一个代码块,并抛出一个不满足条件的异常。
这通过以下方式实现:
def permit_if[T]( condition: Boolean )( f: => T ): T = {
if ( condition ) f
else throw new Exception("Permit conditions not met!")
}
您可以这样使用它:
object AccessProtectedClass extends App{
def protectedMethod( param:String ): Int =
permit_if (param.startsWith("asdf") && RAM <= 10) {
var result = 10
//do something
return result;
}
}
实际上标准库已经包含一个方法require
来检查需求,所以除非你需要抛出一个非常特殊的异常,否则你可能只是使用它。只需将permit_if
替换为上面代码段中的require
即可。
答案 2 :(得分:-1)
Scala DSL是有效的Scala代码。你发布的不是。因此,这是不可能的。