假設我有一個定義為
的類case class MyClass(myArray: Array[Int])
我想只允許myArray引數是特定長度的實體,例如3。
我想只允許myArray引數是特定長度的實體。
myArray.size == 3嗎?我發現的唯一方法是在運行時通過一個智能構造器,檢查myArray的大小,然后失敗--例如使用require。
uj5u.com熱心網友回復:
我可以在型別/編譯級別上強制要求myArray.size == 3嗎?
是的,Scala可以在型別級別上表示數字。例如,使用來自shapeless的Sized
import shapeless._
import syntax.sized._
import nat._
case class MyClass(myArray: Sized[Array[Int], _3])
MyClass(Sized[Array](1,2, >3)) // ok
MyClass(Sized[Array](1, 2,3,4) //編譯時錯誤。
Array(1,2,3,4) 。 sized(3).map(MyClass) // None。
下面是你在Scala 3中使用scala.compiletime.ops設施時可能采取的方法
import scala.compiletime.ops.int.S
enum MyArray[Size, A] 。
case Nil extends MyArray[0, Nothing]
case Cons[N < 。Int, B] (head: B, tail: MyArray[N, B]) extends MyArray[S[N],B]
import MyArray._
val xs: MyArray[3, Int] = Cons(1。Cons(2, Cons(3, Nil) ) )
val ys: MyArray[4, Int] = Cons(1, Cons(2, Cons(3, Cons(4, Nil))))
case class MyClass(myArray: MyArray[3, Int])
MyClass(xs) // ok
MyClass(ys) //compile-time error
uj5u.com熱心網友回復:
你可以在所有你想要的東西上使用require:)
case class MyClass(myArray: Array[Int]) {
require(myArray.size == 3, "只允許有3項的陣列!")
}
如果你傳遞的陣列不符合要求,它將拋出一個IllegalArgumentException。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/309092.html
標籤:
