Scala使用字符串按名称设置函数参数

reg*_*exp 1 scala

是否可以通过名称用字符串设置函数的参数.

例如:

给定:

def foo(a: String, b: String)
Run Code Online (Sandbox Code Playgroud)

我可以使用Map来动态调用此函数吗?

Map(("a", "bla"), ("b", "blub"))
Run Code Online (Sandbox Code Playgroud)

如果是这样,怎么样?

谢谢!

som*_*ytt 5

将args地图反射地应用于方法:

apm@mara:~/tmp$ scalam
Welcome to Scala version 2.11.0-M4 (OpenJDK 64-Bit Server VM, Java 1.7.0_25).
Type in expressions to have them evaluated.
Type :help for more information.

scala> val m = Map(("a", "bla"), ("b", "blub"))
m: scala.collection.immutable.Map[String,String] = Map(a -> bla, b -> blub)

scala> import reflect.runtime._
import reflect.runtime._

scala> import universe._
import universe._

scala> class Foo { def foo(a: String, b: String) = a + b }
defined class Foo

scala> val f = new Foo
f: Foo = Foo@2278e0e7

scala> typeOf[Foo].member(TermName("foo"))
res0: reflect.runtime.universe.Symbol = method foo

scala> .asMethod
res1: reflect.runtime.universe.MethodSymbol = method foo

scala> currentMirror reflect f
res2: reflect.runtime.universe.InstanceMirror = instance mirror for Foo@2278e0e7

scala> res2 reflectMethod res1
res3: reflect.runtime.universe.MethodMirror = method mirror for Foo.foo(a: String, b: String): java.lang.String (bound to Foo@2278e0e7)

scala> res1.paramss.flatten
res5: List[reflect.runtime.universe.Symbol] = List(value a, value b)

scala> .map(s => m(s.name.decoded))
res7: List[String] = List(bla, blub)      

scala> res3.apply(res7: _*)
res8: Any = blablub
Run Code Online (Sandbox Code Playgroud)

请注意,您需要展平参数列表paramss.flatten.这是一个有序的参数列表,您可以轻松地映射到您的args.

聪明的命名约定paramss旨在传达多重嵌套; 我个人认为它好像paramses用英语拼写.

但是现在我看到它拼写出来了,我可能会用埃及法老来说它.