我想在编译时强制约束Scala方法的参数值.
例如:
case class Foo(numberOfFoo: Int, ...)
Run Code Online (Sandbox Code Playgroud)
numberOfFoo是Int上面的,但我真的想把它变成一个正整数.我已经尝试过像PositiveInt这样的类来强制执行此操作,但是这只是将检查推送到另一个仍未进行编译时检查的类.
使用上面的例子,我想要这个:
val n: Int = ...
val f: Foo = Foo(n)
Run Code Online (Sandbox Code Playgroud)
如果n > 0编译而不编译if n <= 0.我不希望实例化代码必须处理可能的异常,处理Option[Foo]或最终使用Foowhere Foo.numberOfFoo != n(即我不想使用输入参数的绝对值).
更新:感谢您提供有用的信息.这是我所担心的.大多数情况下,我希望能够指定必须具有正整数大小的东西的大小.所以这似乎是最好的方法:
case class Foo(bar: Bar) {val n = bar size}
Run Code Online (Sandbox Code Playgroud)