Scala:具有特殊字符的枚举

Scala : Enumeration with special characters

如何创建和使用其值中包含一些特殊字符和空格的枚举?

object Bots extends Enumeration {
  type Bots = Value
  val `apis-google`, `mediapartners-google`, `adsbot-google-mobile-apps`, `google favicon` = Value
}

调用此枚举时,特殊字符似乎被某些内部标识符替换或更改了它们的编码:

for (bot <- Bots.values) println(bot)

输出:

apis$minusgoogle 
mediapartners$minusgoogle 
adsbot$minusgoogle$minusmobile$minusapps 
google$u0020favicon

编辑:我正在使用 scala 2.2

$ scala
Starting scala3 REPL...
scala> object Bots extends Enumeration {                                                                                                                                                                           
     |   type Bots = Value
     |   val `apis-google`: Bots = Value(0, "apis-google")
     |   val `mediapartners-google`: Bots = Value(1, "mediapartners-google") 
     |   val `adsbot-google-mobile-apps`: Bots = Value(2, "adsbot-google-mobile-apps")
     |   val `google favicon`: Bots = Value(3, "google favicon")
     | }
     | 
// defined object Bots

scala> for (bot <- Bots.values) println(bot)                                                                                                                                                                       
     | 
apis-google
mediapartners-google
adsbot-google-mobile-apps
google favicon

您可以通过重写 Enumeration#Val#toString

来更改枚举的命名行为
scala> object Bots extends Enumeration {
     |   val `apis-google`
     |     , `mediapartners-google`
     |     , `adsbot-google-mobile-apps`
     |     , `google favicon` = new Val {
     |         override def toString() = 
     |           super.toString()
     |             .replace("$minus", "-")
     |             .replace("$u0020", " ")
     |       }
     | }
object Bots

scala> Bots.values.foreach(println)
apis-google
mediapartners-google
adsbot-google-mobile-apps
google favicon

或尝试枚举库

scala> import enumeratum._
     | 
     | sealed trait Bots extends EnumEntry
     | 
     | object Bots extends Enum[Bots] {
     |   val values = findValues
     | 
     |   case object `apis-google` extends Bots
     |   case object `mediapartners-google` extends Bots
     |   case object `adsbot-google-mobile-apps` extends Bots
     |   case object `google favicon` extends Bots
     | 
     | }
import enumeratum._
trait Bots
object Bots

scala> Bots.values.foreach(println)
apis-google
mediapartners-google
adsbot-google-mobile-apps
google favicon

或 Scala 3

scala> enum Bots:                                                                                                                                             
     |   case `apis-google`, `mediapartners-google`, `adsbot-google-mobile-apps`, `google favicon`
     | 
// defined class Bots

scala> Bots.values.foreach(println)
apis-google
mediapartners-google
adsbot-google-mobile-apps
google favicon