2016-12-05 86 views
1
class Test(val myInt :Int){} 

我希望myInt只有0到10必須是允許的。所以如何在val類型的scala中指定成員變量的範圍。爲scala設置int的具體範圍

+0

你的意思是你想在myInt上添加驗證? –

+1

我相信有一種方法可以通過編譯時,在[Shapless](https://github.com/milessabin/shapeless)中進行類型級編程來完成。不幸的是,我並不熟悉知道如何去做 –

回答

2

只需添加require或任何拋出異常,當它變得無效值解決您的問題。

class Test(val myInt :Int){ 
    require(0 <= myInt && myInt <= 10) 
} 
3

Refined一看。它允許您創建在編譯時檢查的範圍類型。

你的範圍應該是這樣的:

type InMyRange = Interval.ClosedOpen[W.`0`.T, W.`10`.T] 

,你可以像這樣創建這種類型的值:

refineMV[InMyRange](0) 
// Refined[Int, InMyRange] = 0 
refineMV[InMyRange](9) 
// Refined[Int, InMyRange] = 9 

在錯誤情況:

refineMV[InMyRange](-1) 
// Left predicate of (!(-1 < 0) && (-1 < 10)) failed: Predicate (-1 < 0) did not fail 
refineMV[InMyRange](10) 
// Right predicate of (!(10 < 0) && (10 < 10)) failed: Predicate failed: (10 < 10)