【问题标题】:Scala : Enumeration with special charactersScala:带有特殊字符的枚举
【发布时间】:2021-04-26 08:42:23
【问题描述】:

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

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 2 中的Enumeration 很少使用。只使用一个密封的特征和一堆案例对象会更简单、更容易。

标签: scala jvm


【解决方案1】:
$ 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

【讨论】:

    【解决方案2】:

    您可以通过覆盖 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
    
    

    【讨论】:

    • 谢谢!我在问题中添加了版本!
    猜你喜欢
    • 2022-01-19
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多