【问题标题】:Subtracting two Option[Double]减去两个选项[双]
【发布时间】:2021-11-14 10:26:54
【问题描述】:

我有两个可选的 double 变量,当它们是 None 时,我想将它们视为 0

var x: Option[Double] = Option(0)
var y: Option[Double] = Option(0)
println("Expected 0 : "+(x ++ y).reduceOption(_ - _)) // 0

x = Option(4)
y = Option(0)
println("Expected 4 : "+(x ++ y).reduceOption(_ - _)) // 4

x = Option(0)
y = Option(4)
println("Expected -4 : "+(x ++ y).reduceOption(_ - _)) // -4

x = Option(4)
y = None
println("Expected 4 : "+(x ++ y).reduceOption(_ - _)) // 4

x = None
y = Option(4.0)
println("Expected -4 : "+(x ++ y).reduceOption(_ - _)) // 4

我期待的最后一个-4,但我得到了4

如果我使用

(for (i <- x; j <- y) yield i - j)

然后我得到None

如果我尝试一下

x.getOrElse(0) - y.getOrElse(0) // value - is not a member of AnyVal

然后我得到错误value - is not a member of AnyVal

【问题讨论】:

  • None ++ Option(4.0) 计算结果为 Iterable(4.0)。由于集合中只有一个元素,因此无需减少任何内容。
  • 0 不是Double。为此,您需要 0.00D0d。在您的getOrElse() 电话中尝试一下。

标签: scala option


【解决方案1】:

(x ++ y).reduceOption(_ - _) 是 Scala 恕我直言如何迷惑人们的完美示例。 ++Option 上运行并不是即时的,因为它们也是 Seq

话虽如此,正如 cmets 中已经建议的那样,直接的方法是使用 getOrElse:

x.getOrElse(0d) - y.getOrElse(0d)

您需要精确d 才能获得Double 否则,您会得到AnyVal,因为AnyValInt(来自getOrElse)和Double 的唯一共同父类型(选项中的值)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多