根据文档, None
对象旨在“表示不存在的值”。据我所知,它主要用作空的 Option
。但是你认为将它用于其他目的是个好主意吗?例如,在我的库中,我想要一个通用的“空”对象,它可以分配给各种缺失值,我只需根据需要将“空”值隐式转换为我的类型:
// 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
是个好主意吗?
最佳答案
如果您不能或不想使用继承定义默认值,我建议保留新对象。将 None
重用于 Some
对应的其他东西似乎是错误的,并没有真正为您节省多少。
关于Scala:除了空选项之外,将 None 用于其他目的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6087492/