所以一个 Option[Int]
或 Option[String]
或者就此而言 Option[A]
结果 Some(A)
或 None
,但是一个 Boolean
不同,因为它本质上代表双重状态( true
/false
),拥有 Option[Boolean]
有意义吗? ?我在 JSON
时经常遇到这种情况响应不应包含基于某些业务逻辑的 boolean 字段。
有什么想法吗?
最佳答案
可选性是与数据类型的正交问题。是的,Option[Boolean]
和说的一样有意义 Option[Int]
.
让我们谈谈您的特定用例。
如果业务规则说字段(比如说)isPrimeTime
必须是 Boolean
类型,但它是可选的,那么您应该使用 Option[Boolean]
对其进行建模.None
在此上下文中表示缺少值,Some(true)
将意味着“现在和真实”,Some(false)
将意味着“存在和错误”。这也将允许您在代码中添加默认值,如下所示:
val isPrimeTime = json.getAs[Option[Boolean]]("isPrimeTime").getOrElse(false)
您可以雇用各种
Option
在此类设置中出现的其他常见用例的组合器。 (我会让你的想象力发挥作用。)如果您的域有很多这样的“三态”字段,并且如果第三个状态表示一些特定于域的想法,从上下文中不明显的东西,我强烈建议创建您自己的总和类型。即使您在技术上仍然可以使用
Option[Boolean]
,这可能不利于您的理智。这是一个例子。sealed trait SignalValueIndication
case class Specified(value: Boolean) extends SignalValueIndication
case object DontCare extends SignalValueIndication
// Use
val signalValue = signalValueIndication match {
case Specified(value) => value
case DontCare => chooseOptimalSignalValueForImpl
}
这似乎是一个巨大的浪费,因为您正在失去
Option
上可用的组合器。 .这是部分正确的。部分原因是因为这两种类型是同构的,所以写桥不会那么难。sealed trait SignalValueIndication {
// ...
def toOption: Option[Boolean] = this match {
case Specified(value) => Some(value)
case DontCare => None
}
def getOrElse(fallback: => Boolean) = this.toOption.getOrElse(fallback)
}
object SignalValueIndication {
def fromOption(value: Option[Boolean]): SignalValueIndication = {
value.map(Specified).getOrElse(DontCare)
}
}
这仍然是重要的重复,您必须根据具体情况判断增加的清晰度是否可以弥补。
HaskellTips 最近在 twitter 上提出了类似的建议,随后也进行了类似的讨论。你可以找到它here .
有时字段的存在与否是您可以编码到数据结构中的决定。使用
Option
在这种情况下是错误的。这是一个例子。想象有一个字段
differentiator
允许以下两种值。// #1
{ "type": "lov", "value": "somethingFromSomeFixedSet" },
// #2
{ "type": "text", "value": "foo", "translatable": false }
在这里,假设
translatable
字段是强制性的,但仅限于`"type": "text"。你可以用
Option
来建模因此:case class Differentiator(
_type: DifferentiatorType,
value: String,
translatable: Option[Boolean]
)
然而,更好的建模方法是:
sealed trait Differentiator
case class Lov(value: String) extends Differentiator
case class Text(value: String, translatable: Boolean) extends Differentiator
亚伦·明斯基的 Effective ML谈话有一个关于这个的部分。您可能会发现它很有帮助。 (虽然他使用 ML 来说明要点,但这个演讲很容易理解,也适用于 Scala 程序员)。
关于json - Scala:Option[Boolean] 有意义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24268388/