在Scala中将构造函数作为函数处理 - 如何将构造函数放在映射中?

Wil*_*ard 10 constructor scala function

我需要解析一些消息.消息的前4个字节标识消息的类型,因此,使用它,我可以实例化正确类型的对象.为了使这个有效的操作,我想我会创建一个哈希映射,其中键是前4个字节,值是对象构造函数.我可以只查找构造函数并调用它.

毕竟,构造函数只是函数,将函数放在映射中应该没有任何问题.事实证明,我遇到了一些困难,因为我不知道如何正确地表达对构造函数的引用.

为了得到一个简单的例子,假设我们有一个消息基类MsgBase,和几个子类,MsgAMsgB.如果我为每个消息创建一个伴随对象并将一个工厂函数放入其中,我可以使用这些函数使数组没有任何问题.

这是一个简化的示例,它将消息作为字符串.

class MsgBase(message: String) { }

class MsgA(message: String) extends MsgBase(message) { }

object MsgA  { def makeIt(message: String): MsgA = new MsgA(message)  }
Run Code Online (Sandbox Code Playgroud)

和哪里MsgB相似.然后我可以制作地图:

val cm = Map[String, (String) => MsgBase]("a" -> MsgA.makeIt, "b" -> MsgB.makeIt)

val myMsg = cm("a")("a.This is the message")
Run Code Online (Sandbox Code Playgroud)

看起来我应该能够在构建映射的表达式中直接引用消息对象构造函数,而不是在伴随对象中使用普通函数,但我还没有想出任何表达方式.有办法吗?

Rex*_*err 15

尝试

"a" -> (new MsgA(_))
Run Code Online (Sandbox Code Playgroud)

(需要所有括号).

即使这不起作用,您当然也可以明确地定义函数:

"a" -> ( (s: String) => new MsgA(s) )
Run Code Online (Sandbox Code Playgroud)