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)
而不必总是转换A
为Some(a)
.
是否可以 ?
可能,是:
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)
归档时间: |
|
查看次数: |
141 次 |
最近记录: |