性状(或类)之间的穿越方法

trait t{ val y = "z" def t1(x:String):String=x+"a"+y def t2(x:String):String= x+"b"+y def t3(x:String):String= x+"c"+y } class c extends t { val funcSet = Set(t1 _,t2 _,t3 _) def multiBitamin(input:String) = for(f <- funcSet) yield f(input) }

我想T1,T2,T3之间穿过,而不具有集像funcSet

val funcSet = Set("t1","t2","t3")

公认

--------------解决方案-------------

做到这一点的办法仍然是使用反射,虽然这可以给你一些其他方法(如toString下图):

scala> trait t{
| val y = "z"
| def t1(x:String):String=x+"a"+y
| def t2(x:String):String= x+"b"+y
| def t3(x:String):String= x+"c"+y
| }
defined trait t

scala> val inst = new t{}

scala> inst.getClass.getMethods.filter(_.getName.startsWith("t")) map { m => (s: String) => m.invoke(inst, s) }

然后使用结果遍历的功能。 当然,你可能会比这更聪明,和过滤器根据参数及其类型的数量方法,以及包装储存在基础地图来访问它们。

编辑:

如果你想有一个叫(说的方法的具体名称t1 ),你可以这样做:

scala> val f = (s: String) => inst.getClass.getMethods.find(_.getName == "t1").get.invoke(inst, s)
f: (String) => java.lang.Object = <function1>

做到这一点的另一种方式是调用点,如果该方法的名字是在编译时已知使用结构类型:

scala> (inst: AnyRef).asInstanceOf[{def t1(s: String): String}].t1("Hello ")
res9: String = Hello az

请注意,您不能在这里使用一个字符串,像以前一样。 这也采用了发动机罩下的反射。

此外,一个新的Dynamic特性被添加到Scala的,其中子将允许呼叫通过在运行时获得它的名字的方法。 这将是一些未来的版本可供选择。

分类:斯卡拉 时间:2015-03-15 人气:1
本文关键词: 函数式编程,斯卡拉
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 2.130 (s). 10 q(s)