リストのようにパターン マッチできる BitSet を取得する簡単で最良の方法はありますか?
val btst = BitSet(1,2,3,4)
btst match {
...
case head :: tail => tail
}
リストのようにパターン マッチできる BitSet を取得する簡単で最良の方法はありますか?
val btst = BitSet(1,2,3,4)
btst match {
...
case head :: tail => tail
}
定義上、セットは順序付けられていないコレクションであり、そのようなコレクションに対するパターン マッチングはエラーが発生しやすいものです。必要に応じてリストに変換します...また、常に同じものを返すことに依存してはいけませんhead
。tail
BitSet は順序付けられていますが、エクストラクタはありません。
編集:しかし、ユーモアがないわけではありません。
object |<| {
def unapply(s: BitSet): Option[(Int, BitSet)] =
if (s.isEmpty) None
else Some((s.head, s.tail))
}
def flags(b: BitSet) = b match {
case f"5 || 10" => println("Five and dime") // alas, never a literal
case 5 |<| any => println(s"Low bit is 5iver, rest are $any")
case i |<| any => println(s"Low bit is $i, rest are $any")
case _ => println("None")
}
def dump(b: BitSet) = println(b.toBitMask.mkString(","))
val s = BitSet(5, 7, 11, 17, 19, 65)
dump(s)
// ordinary laborious tests
s match {
case x if x == BitSet(5) => println("Five")
case x if x == BitSet(5,7,11,17,19,65) => println("All")
case x if x(5) => println("Five or more")
case _ => println("None")
}
// manually matching on the mask is laborious
// and depends on the bit length
s.toBitMask match {
case Array(2L) => println("One")
case Array(657568L) => println("First word's worth")
case Array(657568L, _) => println("All")
case _ => println("None")
}
// or truncate for special case
s.toBitMask(0) match {
case 2L => println("One")
case 657568L => println("First word's worth")
case _ => println("None")
}