减去两个选项[双]

Subtracting two Option[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

(x ++ y).reduceOption(_ - _) 是一个完美的例子,说明如何在 Scala 恕我直言中混淆人们。 ++Option 的操作不是立即的,因为它们也是 Seq.

也就是说,正如评论中已经建议的那样,直接的方法是使用 getOrElse:

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

您需要精确 d 以获得 Double 否则,您会得到 AnyVal 因为 AnyVal 是 [=20= 的唯一公共父类型](来自 getOrElse)和 Double(选项中的值)。