2014-10-28 100 views
0

我已经实现了一个方法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尽可能不进行类型检查。

回答

0

我想这就是你要找的模式:

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")) 
    } 
} 
+0

是的,这正是我一直在寻找。我在哪里可以读到关于'thisenum:Enumeration =>'线的原因,这一切看起来都像魔术一样? – synapse 2014-10-28 19:23:40

+0

这似乎是我能够快速找到的最好的东西:http://marcus-christie.blogspot.com/2014/03/scala-understanding-self-type.html – Nate 2014-10-28 20:13:54

0

你看到的具体错误是什么?

您可能更喜欢使用“pimp我的库模式”将此方法添加到现有的枚举上,而不是使用特征。