Scala:除了空选项之外,将 None 用于其他目的

标签 scala option implicit-conversion

根据文档, 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 的一个原因是用户会期望 f1f2 分别返回 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/

相关文章:

java - 被 "Scala in Depth"选项示例混淆

java - 在可为空的 Optional 中检索值的最佳方法是什么?

scala - 为什么我不能在 for-yield 表达式上调用方法?

scala - 将参数添加到具有默认值的案例类

Scalactic Accumulation 的 withGood of Seq

php - 从mysql拉取时如何在php选项值中添加计算功能?

javascript - 使用jQuery禁用功能,直到所有选择均被更改

c - 为什么这种隐式转换(在不同指针类型之间)有效?

C# 隐式转换和从 Object 的转换

c# - LINQ 不能隐式转换