我想扩展课程Option[Int]
,以便在0
时返回None
,如果不是Some
,则返回None
中的值。我应该如何使下面的代码工作?
Some(10).default // returns 10
Option.empty[Int].default // returns 0
答案 0 :(得分:7)
您可以使用所需的方法定义隐式类,它包含Option[Int]
:
implicit class OptionIntExtension(option: Option[Int]) {
def default: Int = option.getOrElse(0)
}
将此类导入范围时,问题中的代码可以正常工作。
答案 1 :(得分:3)
你可以通过几种方式做到这一点。
使用模式匹配:
val input: Option[Int] = Some(10)
input match {
case Some(value) => 10
case None => 0
}
输出:
res0: Int = 10
使用getOrElse
:
val input: Option[Int] = Some(10)
input.getOrElse(0)
输出:
res1: Int = 10
修改强>
为了使这个工作像你原来的问题一样,将它弹出到范围内的隐式类中(正如Kolmar建议的那样):
implicit class DefaultExtension(input: Option[Int]) {
def default: Int = input.getOrElse(0)
}
Some(10).default
res0: Int = 10
Option.empty[Int].default
res1: Int = 0
implicit class DefaultExtension(input: Option[Int]) {
def default: Int = input match {
case Some(value) => 10
case None => 0
}
}
Some(10).default
res0: Int = 10
Option.empty[Int].default
res1: Int = 0