是否可以通过名称用字符串设置函数的参数.
例如:
给定:
def foo(a: String, b: String)
Run Code Online (Sandbox Code Playgroud)
我可以使用Map来动态调用此函数吗?
Map(("a", "bla"), ("b", "blub"))
Run Code Online (Sandbox Code Playgroud)
?
如果是这样,怎么样?
谢谢!
将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用英语拼写.
但是现在我看到它拼写出来了,我可能会用埃及法老来说它.
| 归档时间: |
|
| 查看次数: |
900 次 |
| 最近记录: |