我希望能夠傳遞「無」的可選原因。我嘗試了延長「無」恩:擴展選項w /原因
case class NoneReason(reason: String) extends None
卻得到了一個「未發現:類型無」,然後我想:
case class NoneReason(reason: String) extends Option[Nothing] {
def isEmpty = true
def get = throw new NoSuchElementException("None.get")
}
,但我從密封類選一「」非法繼承「
我猜這是一個特殊的情況,因爲‘無’實際上是空或東西的別名。
我認爲複製選項源,並將其重命名爲TriOption或東西,但日似乎很難維持。什麼將是一個優雅的方式來解決這個問題?
您可以使用'Try [T]'或'Either [String,T]'而不是創建自己的類型。 – Lee 2014-09-24 21:17:32
沒有特殊情況,'None'不是任何別名,尤其不是'null'的別名。所有'Option'類都是密封的,最終的或者case對象,這些都是你的意圖,你不應該能夠擴展這些,你不能。一個簡單的例子是'Option(something)match {case Some(x)=> ... case None => ...}'編譯器可以檢查您是否匹配了所有可能的情況,因爲'Option'不是可擴展到基礎包之外。正如@Lee所建議的,你應該使用不同的數據結構,比如'Either [String,T',它基本上是你的'NonReason'類型。 – Noah 2014-09-24 21:23:53
子類型不是慣用的FP;此外,它使代碼更復雜,並禁用了例如匹配情況靜態耗盡檢查。 – 2014-09-25 12:17:42