字符串形式的scala eval函数

时间:2018-06-17 05:20:01

标签: scala eval read-eval-print-loop

我试图定义一个能够决定如何解析CSV的DSL。我想定义简单的函数来转换值,因为值是从CSV中提取的。 DSL将在文本文件中定义。

例如,如果CSV如下所示:

id,name,amt
1,John Smith,$10.00
2,Bob Uncle,$20.00

我想定义以下函数(请注意我希望能够执行任意代码) amt

(x: String) => x.replace("$", "")

有没有办法评估上面的函数并为每个 amt 值执行它?

1 个答案:

答案 0 :(得分:1)

首先,请考虑可能有更好的方法来做到这一点。首先,看来外部DSL包含Scala代码。这真的需要成为DSL吗?

也就是说,可以使用ToolBox来评估任意Scala:

import scala.reflect.runtime.universe._
import scala.tools.reflect.ToolBox

val code = """(x: String) => x.replace("$", "")"""
val toolbox = runtimeMirror(getClass.getClassLoader).mkToolBox()
val func = toolbox.eval(toolbox.parse(code)).asInstanceOf[String => String]
println(func("$10.50")) // prints "10.50"