加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala:将None用于除空选项之外的其他用途

发布时间:2020-12-16 18:21:48 所属栏目:安全 来源:网络整理
导读:根据文档,无对象旨在“代表不存在的值”.据我所见,它主要用作空选项.但是你认为将它用于其他目的是一个好主意.例如,在我的库中,我希望有一个通用的“空”对象,可以为各种缺失值分配,我只是根据需要将“Empty”值隐式转换为我的类型: // In library:trait A
根据文档,无对象旨在“代表不存在的值”.据我所见,它主要用作空选项.但是你认为将它用于其他目的是一个好主意.例如,在我的库中,我希望有一个通用的“空”对象,可以为各种缺失值分配,我只是根据需要将“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分别返回选项[T1]和选项[T2].他们没有.当然,我可以有def f1:选项[T1],但在这种情况下,这些值实际上不是可选的,它们只能有一些默认的空值或实际值,我只想创建默认值“引擎盖“并且通过整个库有一些统一的说法”默认“或”空“.所以问题是,我应该使用None来表达这种“默认”还是选择一些自定义类型?现在我正在使用我自己的对象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而不是我的空是一个好主意吗?

解决方法

如果您不能或不想使用继承来定义默认值,我建议保留新对象.重复使用None除了Some对应的东西似乎是错误的,并没有真正为你节省太多.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读