如何创建和使用值中包含一些特殊字符和空格的枚举?
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`
}