TL; DR:看看底部的例子。
enum中的值沒有字符串名稱(儘管它們具有唯一的數字ID)。有兩種方法的枚舉值怎麼能得到一個字符串名稱:調用Value
當
- 你把它傳遞明確,例如
Value("v1")
- 如果您在該類中創建
val
字段,則Scala會從字段名稱中推斷該值,例如,在val v1 = Value
。這是通過反射內部完成的,通過檢查返回符合類型的所有0-args方法。
第二種情況並不適用於你的例子:val v = Value
不會在類中創建一個方法,v
只是在循環內部的局部變量(隱藏迭代變量v
)。所以,你需要採取第一種方法:現在
val s = Set("v1", "v2", "v3")
object MyEnum extends Enumeration {
s.foreach(Value(_))
}
MyEnum.values.foreach(println) // prints v1 v2 v3
,這不會讓你訪問你的枚舉值容易,MyEnum.v1
將無法正常工作。沒有辦法如何基於一組字符串值將方法/字段動態添加到類中。至少不是沒有一些神奇的字節碼操作,你可能不想冒險。
相反,您可以定義檢索值的自定義方法。以下是使用Symbols的示例,因此您無需使用效率不高的MyEnum.withName()
方法:
val s = Set("v1", "v2", "v3")
object MyEnum extends Enumeration {
type MyEnum = Value
s.foreach(Value(_))
private val constants = s.map(v => Symbol(v) -> withName(v)).toMap
def apply(c: Symbol): MyEnum = constants(c)
}
MyEnum.values.foreach(println) // prints v1 v2 v3
println(MyEnum('v1)) // prints v1