2014-10-28 103 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我的庫模式」將此方法添加到現有的枚舉上,而不是使用特徵。