gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:36:07 25 4
gpt4 key购买 nike

出于好奇,我想知道是否可以做这样的事情:

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)无需总是转换ASome(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com