Scala 3.3.1中能否为枚举Case设置自定义整数值?
在Scala 3.3.1中为枚举Case设置自定义整数值的方法
先明确:Scala 3不允许用户重写枚举的ordinal方法,这就是你碰到报错the ordinal method of enum class MyEnum can not be defined by the user的原因——ordinal是编译器自动生成的固有方法,用来标记case的声明顺序,根本没法手动修改。
不过要实现给每个枚举case设置自定义整数值的需求,有几个靠谱的办法:
1. 给枚举添加自定义字段
直接给每个枚举case定义一个专属的整数字段,比如叫value:
enum MyEnum(val value: Int): case E1 extends MyEnum(1) case E2 extends MyEnum(5) case E3 extends MyEnum(10)
使用时直接访问value字段即可:
println(MyEnum.E1.value) // 输出1
2. 定义映射关系
如果不想修改枚举本身的结构,可以在枚举的伴生对象里定义一个从case到自定义整数的映射:
enum MyEnum: case E1, E2, E3 object MyEnum: val customValues: Map[MyEnum, Int] = Map( E1 -> 1, E2 -> 5, E3 -> 10 )
调用方式:
println(MyEnum.customValues(MyEnum.E1)) // 输出1
3. 用伴生对象的方法封装
还可以在伴生对象里写一个匹配方法来返回自定义值:
enum MyEnum: case E1, E2, E3 object MyEnum: def getCustomValue(e: MyEnum): Int = e match case E1 => 1 case E2 => 5 case E3 => 10
调用时:
println(MyEnum.getCustomValue(MyEnum.E2)) // 输出5
说白了就是没法修改ordinal,但上面这几种方式都能实现你要的自定义整数值需求。
内容的提问来源于stack exchange,提问作者Karl S.
相关产品推荐
相关产品推荐

