如何在 Scala 中对函数值使用模式匹配

How to use pattern matching with function values in Scala

我在一个对象中初始化了几个具有相同输入和输出类型的函数

object Utils {
  def f1(value: Int): Double = ???
  def f2(value: Int): Double = ???
  def f3(value: Int): Double = ???
}

我有这些函数的高阶值列表:

val x = List(Utils.f1, Utils.f2)

如何使用模式匹配来检查对象中声明的那些函数中有哪些函数包含在x中?我想获得类似于以下代码的东西:

x(0) match {
  case Utils.f1 => ...
  case Utils.f2 => ...
}

您不能与函数匹配,它没有有意义定义的等式。

如果您制作 f1f2f3 val,这将成为可能。请注意,在模式匹配时,将使用引用相等性

object Utils {
  val f1: Int => Double = _ * 10.0
  val f2: Int => Double = _ * 20.0
  val f3: Int => Double = _ * 30.0
}

val x: Seq[Int => Double] = List(Utils.f1, Utils.f2)

import Utils._

x(0) match {
  case `f1` => println(1)
  case `f2` => println(2)
  case `f3` => println(3)
}

如果您保留 f1f2f3 def

object Utils {
  def f1(value: Int): Double = value * 10.0
  def f2(value: Int): Double = value * 20.0
  def f3(value: Int): Double = value * 30.0
}

val x: Seq[Int => Double] = List(Utils.f1, Utils.f2)
  
val f1: Int => Double = Utils.f1
val f2: Int => Double = Utils.f2
val f3: Int => Double = Utils.f3

x(0) match {
  case `f1` => println(1)
  case `f2` => println(2)
  case `f3` => println(3)
}

产生 MatchError.