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

cur*_*ous 5 scala implicit pattern-matching

我有一个类似的课程

case class A(a: Int, b: String)
Run Code Online (Sandbox Code Playgroud)

和一个功能

def f(a: Int)(implicit b: String) =???
Run Code Online (Sandbox Code Playgroud)

可以这样做吗?

val a = A(11, "hello")
a match {
  case A(a, implicit b) => f(a)
}
Run Code Online (Sandbox Code Playgroud)

如何在不提取后明确声明参数的情况下隐藏参数b.

Mik*_*len 3

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

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)
}
Run Code Online (Sandbox Code Playgroud)

如果必须隐式传递值,则需要在范围内声明它。例如:

a match {
  case A(a, b) => {
    implicit val s = b
    f(a)
  }
}
Run Code Online (Sandbox Code Playgroud)

另外,正如已经指出的,不要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)
  }
}
Run Code Online (Sandbox Code Playgroud)

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

更新:有一种方法可以做你想做的事:

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)
Run Code Online (Sandbox Code Playgroud)

或者,如果您必须将其包含在模式匹配中,那么最后一位将是:

a match {
  case x: A => {
    import x._
    f(x.a)
  }
}
Run Code Online (Sandbox Code Playgroud)

更新 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
Run Code Online (Sandbox Code Playgroud)

或者

a match {
  case x: A => x.invokeF
}
Run Code Online (Sandbox Code Playgroud)

这有帮助吗?