从 A 到 Some(a) 的隐式转换

Won*_*nay 3 functional-programming scala

出于好奇,我想知道是否可以执行以下操作:

def myMethod(
  a: Option[A] = None,
  b: Option[B] = None, 
  ...
  z: Option[Z] = None
): Something = {
  ...
}
Run Code Online (Sandbox Code Playgroud)

我想要的是不必这样称呼它:

myMethod(
  b = Some(newB),
  m = Some(newM)
)
Run Code Online (Sandbox Code Playgroud)

而是能够做到myMethod(b = newB, m = newM)而不必总是转换ASome(a).

是否可以 ?

Yuv*_*kov 5

可能,是:

object Test {
  implicit def anythingToOption[A](a: A): Option[A] = Option(a)
  def foo(something: Option[Int]): Unit = ???

  def main(args: Array[String]): Unit = {
    foo(1)
  }
}
Run Code Online (Sandbox Code Playgroud)

你应该这样做吗?。为什么?因为具有如此广泛范围的隐式是危险的。一方面,当您实际上需要相关的隐式作用域时,它们可能会导致歧义。其次,当有人阅读此内容时,他们需要了解此转换发生的位置以及原因。第三,这可能会导致细微的错误。

相反,您可以使用扩展方法,无论您是从 Cats 库中获取它们还是自己编写它们:

object Test {
  implicit class OptionOps[A](val a: A) extends AnyVal {
    def toOption: Option[A] = Option(a)
    def some: Option[A] = Some(a)
  }

  def foo(something: Option[Int]): Unit = ???
  def main(args: Array[String]): Unit = {
    foo(1.toOption)
    foo(1.some)
  }
}
Run Code Online (Sandbox Code Playgroud)