我想定义一个可以传递动态参数列表的函数。像这样的东西:
def foo(fields: (String, Any)*) = ???
以这种方式,我可以使用动态命名参数来调用它。类似的东西:
foo(arg1 -> "1", arg2 = 2)
其中 arg1 和 arg2 可以是任何值。有没有办法可以使用 scala Dynamic 对象实现类似的功能?
我通过模仿 ScalaJS 库中 js.Dynamic.literal 对象使用的方法实现了一个解决方案。所以我的完整解决方案是:
case class Params(fields: Map[String, Double]) extends Dynamic
object Params {
def apply(fields: (String, Any)*): Params = Params(fields.toMap.mapValues {
case d: Double => d
case f: Float => f.toDouble
case l: Long => l.toDouble
case i: Int => i.toDouble
case o =>
throw new RuntimeException("Invalid parameter value: " + o)
})
}
object params extends scala.Dynamic {
def applyDynamicNamed(name: String)(fields: (String, Any)*): Params = Params(fields: _*)
def applyDynamic(name: String)(fields: (String, Any)*): Params = Params(fields: _*)
}
然后可以这样使用:
params(a = 1, b = 2.4, c = 0)