扩展枚举
问题描述:
我已经实现了一个方法withNameOption
,如果找不到具有特定名称的枚举成员,但返回None
,但我无法将其提取到一个特征以用于该应用中的所有枚举。目前,代码如下所示:扩展枚举
object FileType extends Enumeration with EnumUtils {
type FileType = Value
def withNameOption(name: String): Option[FileType] = try {
Some(withName(name))
} catch {
case _: NoSuchElementException => None
}
val scala, java, ruby = Value
}
使用this.type
尽可能不进行类型检查。
答
我想这就是你要找的模式:
trait EnumUtils {
thisenum: Enumeration =>
def withNameOption(name: String): Option[thisenum.type#Value] = try {
Some(thisenum.withName(name))
} catch {
case _: NoSuchElementException => None
}
}
object FileType extends Enumeration with EnumUtils {
type FileType = Value
val scala, java, ruby = Value
}
object Test {
def main(args: Array[String]): Unit = {
println("Python: " + FileType.withNameOption("python"))
println("Scala: " + FileType.withNameOption("scala"))
}
}
答
你看到的具体错误是什么?
您可能更喜欢使用“pimp我的库模式”将此方法添加到现有的枚举上,而不是使用特征。
是的,这正是我一直在寻找。我在哪里可以读到关于'thisenum:Enumeration =>'线的原因,这一切看起来都像魔术一样? – synapse 2014-10-28 19:23:40
这似乎是我能够快速找到的最好的东西:http://marcus-christie.blogspot.com/2014/03/scala-understanding-self-type.html – Nate 2014-10-28 20:13:54