2015-07-21 55 views
2

有沒有辦法限制Scala函數中參數的值?例如,如果我有一個稱爲標誌的參數,並且我只希望用戶能夠將值0或1作爲該參數的有效值提交。Scala:限制參數值

我知道我可以編寫一個簡單的if語句來檢查值並返回某種類型的錯誤消息,如果它不可接受的話,但我認爲可能有一個更簡潔的方法來做到這一點,比如當參數在函數聲明中被命名。

回答

3

我通常會在斯卡拉處理這個問題的方法是使基本特徵的情況下與對象:

sealed trait Color 
case object Red extends Color 
case object Green extends Color 
case object Blue extends Color 

//... 
def myFn(arg:Color) = //... 
+0

下劃線寫了一篇關於這個話題的好博客文章 - http://underscore.io/blog/posts/2015/06/02/everything-about-sealed.html。 –

+0

謝謝,這是完美的,實際上解決了我的另一個問題。 @KevinMeredith,希望我能給你點鏈接! –

3

你想要的是「依賴打字」。這種調用在支持它的語言中會是編譯錯誤。不幸的是scala不支持它。

兩個典型的解決方法是使用ADT而不是更大的類型,或者使用具有受限構造方法的包裝。

object ZeroOrOne { 
    def apply(i: Int): Option[ZeroOrOne] = if (i == 0 || i == 1) Some(ZeroOrOne(i)) else None 
} 
case class ZeroOrOne private (i: Int) 
def doStuff(zo: ZeroOrOne) { // use zo.i } 

sealed trait EnableStatus 
case object Enabled extends EnableStatus 
case object Disabled extends EnableStatus 

def setEnabled(es: EnableStatus)