加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在Scala中处理构造函数作为函数 – 如何将构造函数放在地图中?

发布时间:2020-12-16 21:32:17 所属栏目:安全 来源:网络整理
导读:我需要解析一些消息.消息的前4个字节标识消息的类型,因此,使用该消息,我可以实例化正确类型的对象.为了使其成为一个有效的操作,我以为我将创建一个哈希映射,其中key是前4个字节,值是对象构造函数.我可以查找构造函数并调用它. 毕竟,构造函数只是函数,在函数
我需要解析一些消息.消息的前4个字节标识消息的类型,因此,使用该消息,我可以实例化正确类型的对象.为了使其成为一个有效的操作,我以为我将创建一个哈希映射,其中key是前4个字节,值是对象构造函数.我可以查找构造函数并调用它.

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

为了得到具体的一个简化的例子,假设我们有一个消息基类,MsgBase和一些子类,MsgA和MsgB.如果我为每个消息创建一个配对对象,并在其中放置一个工厂函数,我可以使用这些函数使数组没有任何问题.

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

class MsgBase(message: String) { }

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

object MsgA  { def makeIt(message: String): MsgA = new MsgA(message)  }

MsgB类似.然后我可以制作地图:

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

val myMsg = cm("a")("a.This is the message")

似乎我应该能够直接在构建映射的表达式中引用消息对象构造函数,而不是在伴侣对象中使用琐碎的函数,但是我还没有想到这一点.有办法吗

解决方法

尝试

"a" -> (new MsgA(_))

(需要所有括号).

即使这样不行,你当然可以明确地定义这个功能:

"a" -> ( (s: String) => new MsgA(s) )

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读