Согласно документам, объект 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
, но он кажется немного излишним.
EDIT:
Чтобы проиллюстрировать мой вопрос, я добавлю код, который я использую сейчас:
// 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
}
Мой вопрос довольно прост: стоит ли использовать None
от scala вместо моего Empty
?