scala dsl中的自定义方法签名

时间:2013-05-15 13:05:08

标签: scala dsl

有没有办法创建一个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概念?

3 个答案:

答案 0 :(得分:3)

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

  • Scala中缀表示法遵循模式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代码。你发布的不是。因此,这是不可能的。