在Scala中,for...yield 语句非常适合将一系列函数调用链接在一起,以使用 monad 实践定义转换图。 但是,我想在函数范围之外定义函数调用,并动态传入它们,以便链式函数调用可以由另一个应用程序定义并使用字符串作为参数传入。
根据 scala 语言规范,用于...yield 是一个枚举,但我只能找到枚举的硬编码示例。
有没有办法动态生成枚举并将其传递到 for...产量声明?
例如,给定以下工作代码:
import scala.util.Try
val map1: Map[String, Int] = Map("val1"->1,"val2"->2,"val3"->3)
def mapTest(inputMap: Map[String, Int]) = {
for {
x <- Try(inputMap.mapValues(_ * 2))
y <- Try(x.mapValues(_ * 2))
z <- Try(y.mapValues(_ *2))
} yield z
}
mapTest(map1).get
像这样运行它,其中函数列表作为函数列表(伪代码(传入:
import scala.util.Try
val map1: Map[String, Int] = Map("val1"->1,"val2"->2,"val3"->3)
val functionList: String = "(x <- Try(inputMap.mapValues(_ * 2))),(y <- Try(x.mapValues(_ * 2))),(z <- Try(y.mapValues(_ *2)))"
def mapTest(inputMap: Map[String, Int], functionList: String) = {
for {functionList.toEnum} yield z
}
mapTest(map1).get
编辑:看起来将函数作为字符串传入的唯一方法是使用运行时编译,如以下示例所示:如何将字符串从文本输入转换为 Scala 中的函数
还有更多例子在这里:https://docs.scala-lang.org/overviews/repl/embedding.html
这与运行函数列表是不同的问题。 我需要一种方法将包含函数列表的字符串转换为实际函数。
基本上需要将类似这个字符串的东西传递到运行时编译器代码中,然后运行 mapTest(inputMap( 返回新的 map z。
val functionString = s"""
def mapTest(inputMap: Map[String, Int]) = {
| for {
| x <- Try(inputMap.mapValues(_ * 2))
| y <- Try(x.mapValues(_ * 2))
| z <- Try(y.mapValues(_ *2))
| } yield z
|}""".stripMargin
看起来将函数作为字符串传入的唯一方法是使用运行时编译,如以下示例所示: 如何将字符串从文本输入转换为 Scala 中的函数
还有更多例子在这里:https://docs.scala-lang.org/overviews/repl/embedding.html