Я хотел бы определить функцию, которой можно передать список динамических аргументов. Что-то вроде этого:
def foo(fields: (String, Any)*) = ???
Таким образом, чтобы я мог вызвать его, используя аргументы с динамическими именами. Что-то вроде :
foo(arg1 -> "1", arg2 = 2)
Где arg1 и arg2 могут быть чем угодно. Есть ли способ добиться чего-то подобного, используя динамический объект scala?
Вы также можете проверить Shapeless Record
либо для вдохновения, либо для непосредственного использования: javadoc.io/doc/com.chuusai/shapeless_2.13/2.3.10/shapeless/…
Я нашел решение, имитируя подход, используемый в библиотеке 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)
Почему бы просто не
Map[String, Any]
? или с(String, Any)*
это работает, если вы используете кавычки:foo("arg1" -> "1", "arg2" -> 2)
- Кстати, какую метапроблему вы здесь пытаетесь решить?