根據文檔,None
對象旨在「表示不存在的值」。據我所見,它主要用作空的Option
。但是,你認爲將它用於其他目的是個好主意。舉例來說,在我的圖書館我希望有需要可能被分配給不同的缺失值,在這裏我也只是含蓄的「空」值轉換爲我的類型的通用的「空」的對象:Scala:將None用於除空之外的其他目的選項
// In library:
trait A {
implicit def noneToT1(none: Option[Nothing]): T1 = defaultT1
implicit def noneToT2(none: Option[Nothing]): T2 = defaultT2
def f1: T1
def f2: T2
}
// In the code that uses the library
class EmptyA extends A {
def f1 = None
def f2 = None
}
一以這種方式使用None
的不(錯)的原因在於用戶預期f1
和f2
分別返回Option[T1]
和Option[T2]
。而他們沒有。當然,我可以有def f1: Option[T1]
,但在這種情況下,這些值實際上並不是可選的,它們只能有一些默認的空值或實際值,我只是想創建「引擎蓋下」的默認值並且有一些統一的通過整個圖書館說「默認」或「空」的方式。所以問題是,我應該使用None
來表達這種「默認性」還是使用某種自定義類型?現在我用我自己的object Empty
,但感覺有點多餘。
編輯: 要ilustrate我的問題,我將添加我使用的是現在的代碼:
// In library:
trait Empty
object Empty extends Empty
trait A {
implicit def emptyToT1(none: Empty): T1 = defaultT1
implicit def emptyToT2(none: Empty): T2 = defaultT2
def f1: T1
def f2: T2
}
// In the code that uses the library
class EmptyA extends A {
def f1 = Empty
def f2 = Empty
}
class HalfFullA extends A {
def f1 = Empty
def f2 = someValue2
}
class FullA extends A {
def f1 = someValue1
def f2 = someValue2
}
我的問題很簡單:這是使用Scala的None
,而不是一個好主意,我Empty
?
這是一個很好的解決方案,我沒有想到它。我喜歡它,因爲您有創建默認值的統一方式,但仍不會混淆用戶對方法的類型。然而在這個特定的庫中,這會有點矯枉過正,並且仍然看起來很醜 - 例如,我的一些方法返回部分函數,所以我必須編寫:'default [PartialFunction [SomeType,OtherType]](當然我可以輸入別名,但那會是事件更多的矯枉過正) – 2011-05-23 06:07:56
在這種情況下,Scala不能推導出類型參數嗎? – 2011-05-23 10:32:24
更新了我的答案。 Scala不能推導出類型,因爲如果推斷出表達式類型並從中獲取方法的返回類型,則不會相反。 – IttayD 2011-05-23 10:57:56