使用 scala Dynamic 传递动态参数列表

问题描述 投票:0回答:1

我想定义一个可以传递动态参数列表的函数。像这样的东西:

  def foo(fields: (String, Any)*) = ???

以这种方式,我可以使用动态命名参数来调用它。类似的东西:

  foo(arg1 -> "1", arg2 = 2)

其中 arg1 和 arg2 可以是任何值。有没有办法可以使用 scala Dynamic 对象实现类似的功能?

scala
1个回答
0
投票

我通过模仿 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)
© www.soinside.com 2019 - 2024. All rights reserved.