2013-05-15 117 views
1

有沒有一種方法來創建一個階DSL使我寫類似這樣的僞代碼編碼自定義方法簽名

編輯:改到斯卡拉僞代碼

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概念?

回答

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即可。

-1

Scala DSLs是有效的Scala代碼。你發佈的不是。因此,這是不可能的。

+0

thx爲提示。更改爲scala psydo代碼 – fmo

3

可以編寫類似於此的代碼。有兩件事你必須記住:

  • 斯卡拉中綴符號遵循模式obj method param method param method param...,所以你必須將方法名稱的關鍵字放在正確的地方。
  • 運算符優先級可以幫助你或阻礙你。例如,<=and具有更高的優先級,這將有助於您展示的代碼段。點符號也是如此。例如,對象後面的括號也可以獲得更高的優先級,例如Specs2中的apply方法。

所以,回到這一點:

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)的參數可能是名稱,所以如果結果由前者定義,則可以避免評估後面的條件。