Scala:选项类型的数值运算

Scala: numerical operations on Option type

在今年的 Devoxx 会议上,Dick Wall 就 Scala 编程中的设计和模式给出了 presentation;第一部分应该是对基础知识的简要强调。在1:09:35,他写了下面的函数:

def safeDiv(a: Int, b: Int): Option[Int] = if (b == 0) None else Some(a / b)

其中 returns 一个编译错误 [good]。我的问题是因为这是一个相当常见的情况:我如何对

的返回值进行整数运算 * / +
safeDiv(6, 2) // Some(2)

类似

safeDiv(6, 2) * 6 // 18 [error]

在地图块中进行

saveDiv(6, 2).map(_ * 6)

您不能将 Option 与 Int 相乘,您绝对应该像这样将 Option 的值相乘:

 saveDiv(6, 2).map (_ * 6)  // Returns Option[Int]

或者您可以使用 "Pimp My Library" 模式在 Int 的选项上定义方法 '*':

 class PimpedOption(oi:Option[Int]) { 
   def *(i:Int) = oi.map(_*i)
 }

 implicit def instance(oi:Option[Int]) = new PimpedOption(oi)

那么你可以这样做:

 saveDiv(6, 2) * 6 // Gives Option[Int]