如何在对象初始化的后期将body分配给defs?

时间:2013-04-02 12:02:32

标签: scala

由于函数是Scala中的对象,我想通过类参数初始化类方法 例如:

class myClass(functionsMap: Map[methodNameString,Function]){
      def method1;
      def method2;
}

我想通过此functionsMap初始化此方法。

伪代码可以如下:

Map(
  "method1" -> { x => x.size },
  "method2" -> { () => println("hello") }
)

然后我想迭代这个地图并通过这个参数化的函数初始化方法 在课堂内如下:

class myClass(functionsMap: Map[methodNameString,Function]) {
      def method1 = functionsMap("method1")
      def method2 = functionsMap("method2")
}

有谁知道如何实施它?

1 个答案:

答案 0 :(得分:4)

可以使用Dynamic trait

import scala.language.dynamics

class myClass(functionsMap: Map[ String, Function0[Unit]]) extends Dynamic {
  def selectDynamic(methodName: String) = { 
   println("I'm calling " + methodName) 
   functionsMap(methodName).apply()
  } 
}

scala> val funcs = Map("foo" -> (() => {println("I'm method passed outside")}))
// funcs: scala.collection.immutable.Map[String,() => Unit] = Map(foo -> <function0>)

scala> new myClass(funcs)
// res12: myClass = myClass@2d298123

scala> res12.foo
I'm calling foo
I'm method passed outside