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

scala – 正确使用可变/不可变列表

发布时间:2020-12-16 09:32:18 所属栏目:安全 来源:网络整理
导读:目前,我试图了解Scala中的功能编程,我遇到了一个我无法想象的问题。 想像下面的情况: 你有两个类:Controller和Bot。一个Bot是一个独立的Actor,由控制器启动,执行一些昂贵的操作并将结果返回给Controller。因此,控制器的目的很容易描述:实例化Bot的多
目前,我试图了解Scala中的功能编程,我遇到了一个我无法想象的问题。

想像下面的情况:

你有两个类:Controller和Bot。一个Bot是一个独立的Actor,由控制器启动,执行一些昂贵的操作并将结果返回给Controller。因此,控制器的目的很容易描述:实例化Bot的多个对象,启动它们并接收结果。

到现在为止还挺好;我可以实现所有这一切,而不使用任何可变对象。

但是,如果我必须存储一个Bot返回的结果,然后再使用它作为另一个Bot的输入(后来意味着我不知道什么时候在编译时),我该怎么办?

使用可变列表或集合进行此操作相当容易,但是我在代码中添加了很多问题(因为我们在此处处理并发问题)。

遵循FP范式,可以通过使用不可变对象(列表…)来安全解决这个问题吗?

BTW,新的FP,所以这个问题可能听起来很愚蠢,但我不知道如何解决这个:)

解决方法

这是一个像Erlang的演员如何看Scala:

case class Actor[State](val s: State)(body: State => Option[State]) { // immutable
  @tailrec
  def loop(s1: State) {
    body(s1) match {
      case Some(s2) => loop(s2)
      case None => ()
    }
  }

  def act = loop(s)
}

def Bot(controller: Actor) = Actor(controller) { 
  s => 
    val res = // do the calculations
    controller ! (this,res)
    None // finish work
} 

val Controller = Actor(Map[Bot,ResultType]()) {s =>
  // start bots,perhaps using results already stored in s
  if ( 
    // time to stop,e.g. all bots already finished 
  )
    None
  else
    receive {
      case (bot,res) => Some(s + (bot -> res)) // a bot has reported result
    }
}

Controller.act

(编辑:李大同)

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

    推荐文章
      热点阅读