【发布时间】:2011-08-30 13:23:37
【问题描述】:
根据文档,None 对象旨在“表示不存在的值”。据我所知,它主要用作空的Option。但是您认为将其用于其他目的是否是个好主意。例如,在我的库中,我想要一个通用的“Empty”对象,它可以分配给各种缺失值,我只需根据需要将“Empty”值隐式转换为我的类型:
// 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,不过感觉有点多余。
编辑: 为了说明我的问题,我将添加我现在正在使用的代码:
// 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 是个好主意吗?
【问题讨论】:
标签: scala option implicit-conversion