作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
出于好奇,我想知道是否可以做这样的事情:
def myMethod(
a: Option[A] = None,
b: Option[B] = None,
...
z: Option[Z] = None
): Something = {
...
}
我想要的是不必这样调用它:
myMethod(
b = Some(newB),
m = Some(newM)
)
而是能够做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)
}
}
你应该这样做吗? 不。为什么?因为范围如此广泛的隐式是危险的。其一,当您实际上需要范围内的相关隐含内容时,它们可能会导致歧义。其次,当有人读到这篇文章时,他们需要了解这种转换发生在哪里以及为什么。第三,这可能会导致微妙的错误。
相反,您可以使用扩展方法,无论您是从 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)
}
}
关于scala - 从 A 到 Some(a) 的隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53974985/
我是一名优秀的程序员,十分优秀!