减去两个选项[双]
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
(选项中的值)。
我有两个可选的双变量,当它们是 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
(选项中的值)。