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]
在今年的 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]