2016-12-05 87 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)