Scala:带有特殊字符的枚举



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

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

实际上,您可以使用NameTransformer对象对字符串进行编码。问题是枚举正在将字符串与withName方法中的标量符号枚举的名称进行比较(因此对该名称进行编码以构建正确的java名称(。代码如下:

test("enum") {
println(definitions.Countries.`United Kingdom`.toString())
// prints United$u0020Kingdom
val UK = definitions.Countries.withName(NameTransformer.encode("United Kingdom"))
UK shouldBe definitions.Countries.`United Kingdom`
}

最新更新