gpt4 book ai didi

scala - 如何在提取值时将参数注释为模式匹配中的隐式参数

转载 作者:行者123 更新时间:2023-12-04 20:29:50 27 4
gpt4 key购买 nike

我有一个类

case class A(a: Int, b: String)

和一个函数
def f(a: Int)(implicit b: String) =???

有可能做这样的事情吗?
val a = A(11, "hello")
a match {
case A(a, implicit b) => f(a)
}

如何在提取后不显式声明参数 b 的情况下使参数 b 隐式。

最佳答案

我不会担心隐式传递参数,因为在这种特殊情况下您可以轻松地显式提供它:

case class A(a: Int, b: String)

def f(a: Int)(implicit b: String) =???

val a = A(11, "hello")
a match {
case A(a, b) => f(a)(b)
}

如果必须隐式传递值,则需要在作用域中声明它。例如:
a match {
case A(a, b) => {
implicit val s = b
f(a)
}
}

另外,正如已经指出的那样,不要使用 implicit具有共同的类型。如果将其包装在另一个类中会更好:
case class A(a: Int, b: String)

case class SomeCustomString(s: String)

def f(a: Int)(implicit b: SomeCustomString) =???

val a = A(11, "hello")
a match {
case A(a, b) => {
implicit val s = SomeCustomString(b)
f(a)
}
}

如果你能解释隐式参数的用例,我可以提供一个更好的例子。

更新 : 有一种方法可以做你想做的事:
case class SomeCustomString(s: String)

case class A(a: Int, b: String) {
implicit val s = SomeCustomString(b)
}

def f(a: Int)(implicit s: SomeCustomString) =???

val a = A(11, "hello")
import a._
f(a.a)

或者,如果您必须在模式匹配中使用它,最后一位将是:
a match {
case x: A => {
import x._
f(x.a)
}
}

更新 2 :或者,作为另一种方法(同样, implicit 很大程度上是多余的):
case class SomeCustomString(s: String)

case class A(a: Int, b: String) {
implicit val s = SomeCustomString(b)
def invokeF = f(a)
}

def f(a: Int)(implicit s: SomeCustomString) =???

val a = A(11, "hello")
a.invokeF

或者
a match {
case x: A => x.invokeF
}

这有帮助吗?

关于scala - 如何在提取值时将参数注释为模式匹配中的隐式参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49264948/

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