1

Is there a way to create a scala dsl which enables me to write code similar to this pseudo-code

edited: changed to scala pseudo code

object AccessProtectedClass extends App{
   def protectedMethod(param:String)
     permit_if (param.startsWith("asdf") and RAM <= 10) : Int = {
         var result = 10
         //do something
         return result;
   } 
}

If the access is not granted due to the 'permit if' statement a exception should be thrown. Which scala concepts do I need?

4

3 回答 3

3

可以编写类似的代码。您必须记住两件事:

  • Scala 中缀表示法遵循 pattern 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

所以在我看来,构建器模式似乎可以在这里工作,只需稍作调整。to and(或 any or)的参数可能是按名称命名的,因此如果结果由前一个条件定义,则可以避免评估后一个条件。

于 2013-05-15T13:45:42.380 回答
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_ifrequire

于 2013-05-16T10:56:59.190 回答
-1

Scala DSL 是有效的 Scala 代码。你发的不是。因此,这是不可能的。

于 2013-05-15T13:07:16.747 回答