考虑下面的代码片断,它按字母顺序排列所有的数字从1至9:Scala枚举的懒惰评估?
object AlphabetizedDigit extends Enumeration {
type AlphabetizedDigit = Value
val one, two, three, four, five, six, seven, eight, nine = Value
}
println(for(i <- Range(0, AlphabetizedDigit.maxId)) yield (i, AlphabetizedDigit(i)))
因为零索引,的println
的输出将是一个比特的未直观:
[email protected]:~/code/atomicscala$ scala EnumIDRange.scala
Vector((0,one), (1,two), (2,three), (3,four), (4,five), (5,six), (6,seven), (7,eight), (8,nine))
单程对付这是改变AlphabetizedDigit
的成员定义如下:
val one = Value(1)
val two, three, four, five, six, seven, eight, nine = Value
,然后马确保Range
从1
开始,而不是0
。然后,输出的是直观的一个:
[email protected]:~/code/atomicscala$ scala EnumIDRange.scala
Vector((1,one), (2,two), (3,three), (4,four), (5,five), (6,six), (7,seven), (8,eight), (9,nine))
不过,我真的不喜欢,你需要在两行分裂的声明,如果你只是想切换枚举的起始索引的事实。因此,我尝试以下,这编译就好:
val one, two, three, four, five, six, seven, eight, nine = Value(1)
但是,在运行时,我得到的,因为使用了副本ID的抛出AssertionError
。对我来说这很不合理,但我很好奇为什么在运行时抛出这个错误,而不是编译时。
因为scala目前不是一种依赖类型的语言,它不能理解您将相同的ID提供给不同的值? – Odomontois