如何在 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 类。
场景如下:
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 类。