データサイズ(バイト、KB ...)を表すタイプファミリーを作成しようとしています。そのためのアイデアは、以下に基づいて実際のサイズを持つ基本タイプを構築することです。
type SizeUnit = Int
type B = SizeUnit
type KB = SizeUnit
type MB = SizeUnit
type GB = SizeUnit
type TB = SizeUnit
type PB = SizeUnit
type EB = SizeUnit
type ZB = SizeUnit
type YB = SizeUnit
それらの順序付きリストがあります:
val sizes = List(B, KB, MB, GB, TB, PB, EX, ZB, TB)
そして、ターゲットタイプを取り、それらの間のインデックスの差を見つけ、差の累乗で1024を掛ける変換メソッドがあります。それで:
def convertTo(targetType: SizeUnit): SizeUnit ={
def power(itr: Int): Int = {
if (itr == 0) 1
else 1024*power(itr-1)
}
val distance = sizes.indexOf(targetType) - sizes.indexOf(this)
distance match {
//same type - same value
case 0 => targetType
//positive distance means larget unit - smaller number
case x>0 => targetType / power(distance)
//negative distance means smaller unit - larger number and take care of negitivity
case x<0 => targetType * power(distance) * (-1)
}
}
メソッドの有効性をチェックする前に、いくつかの問題があります(Scalaは初めてです):
- 値ではなく型を保持するリスト(または他のSeq)を作成する方法はありますか?というか、値としてタイプしますか?
- 私が正しく理解していれば、型はコンパイルを超えて保持されません。これは、実行時にGB値を既存のKBに渡すと、型を解読できないことを意味しますか?
ありがとう、Ehud