如何在 Scala 运行 时间调用基于动态输入值的方法?

How to call method based on dynamic input value at run time in scala?

场景如下:

Main class 迭代地从 LIST 中读取输入值(例如 A、B、C、D)。

另一个 class 包含单独方法的实现以相应地处理这些输入值。 例如。只有输入值为A才能调用方法A,只有输入值为B才能调用方法B。

好的部分是所有这些方法都接受完全相同的参数及其类型。 例如A、B、C,都是同一种类型。

在 Scala 中有什么方法可以处理这个问题吗?

我们可以使用 ENUM 和案例逻辑,但正在寻找更好的方法来做到这一点? E. G. Scala 反射 API 或使用案例 classes。

从你的问题来看,你为什么要使用动态调用或反射一点也不明显。


如果所有值 A, ..., D 都属于一个公共类型 Foo,那么它可能不会比 case-classes:

容易多少
sealed trait Foo
case class A(a1: Int, a2: String) extends Foo
case class B(b: Double) extends Foo
case class C(c: String) extends Foo
case object D extends Foo

每次您想将 A, ..., D 转换为其他结果类型 R 时,您只需编写一个 match-case,并在那里处理不同的情况。如果你经常使用它,它仍然太冗长,你可以引入一个 eliminator 类型的 Foo,它接受一堆函数,并将模式匹配隐藏在里面:

object Foo {
  def elim[R](
    aElim: (Int, String) => R,
    bElim: Double => R,
    cElim: String => R,
    dElim: R
  )(f: Foo): R = f match {
    case A(a1, a2) => aElim(a1, a2)
    case B(b) => bElim(b)
    case C(s) => cElim(s)
    case D => dElim
  }
}

通过这种方式,您可以将 match-case 中案例的 命名 换成更短的语法,例如你可以像这样构造一个消除器:

val fooToString = Foo.elim(_ + _, "" + _, identity, "D") _    

或将其应用于 A 的列表 ... D 直接:

List(A(42, "foo"), B(3.1415d), C("bar"), D).
  map(Foo.elim(_ + _, "" + _, identity, "D")).
  foreach(println)

这将输出

42foo
3.1415
bar
D

如果这不值得,只需使用带有常规模式匹配的 case 类。