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

myIntの場合は0から10までしか許されません。val型のスカラーでメンバー変数の範囲を指定する方法。スカラーで整数の特定の範囲を設定する

+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) 
関連する問題