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

斯卡拉 – 是否有可能在阿卡组成FSM?

发布时间:2020-12-16 18:33:20 所属栏目:安全 来源:网络整理
导读:对于常规演员,他们可以组成.但是,我似乎无法找到任何与FSM一起做的事情.而且没有一个接收块可以使用=来添加内容.有没有人有尝试推广FSM的经验? 我无法提供代码示例,因为我还没有任何代码,因为我不知道我是否可以编写FSM. 解决方法 您可以使用部分函数组合状
对于常规演员,他们可以组成.但是,我似乎无法找到任何与FSM一起做的事情.而且没有一个接收块可以使用=来添加内容.有没有人有尝试推广FSM的经验?

我无法提供代码示例,因为我还没有任何代码,因为我不知道我是否可以编写FSM.

解决方法

您可以使用部分函数组合状态行为,方法与构成Actor部分函数的方式相同. when()函数需要 scala.PartialFunction [FSM.this.Event,FSM.this.State]类型的部分函数.在下面的示例中,我使用特征中声明的部分函数(例如,一些常见行为)扩展状态Jibber.您可以使用完全相同的技术,使用声明为scala.PartialFunction [StopEvent,Unit]的PF来扩展特征的onTermination行为.

我使用这种技术从一些复杂的FSM中解除了重要的共同行为.

package monster

import akka.actor._
import monster.FlyingSpaghetti._

// State and data objects
object FlyingSpaghetti {

  trait State

  object Jibber extends State
  object Jabber extends State

  object Ping
  object Done

}

// Trait with common behaviour behaviour
trait FlyingSpaghetti  extends Actor with FSM[State,String]{
  val layer: StateFunction = {
    case Event(Done,s) ?
      println("Done behaviour layered")
      stop()
  }
}

class Monster() extends FlyingSpaghetti {

  startWith(Jibber,"jabber")
  self ! Ping
  println("Starting")

  // First,do the common behaviour PF then do specialised behaviour
  when(Jibber) (layer orElse {
    case Event(Ping,"jabber") ?
      println("jabber")
      goto(Jabber) using "jibber"
    case Event(Done,s) ?
      println("Done jabbering")
      stop()
  })

  when(Jabber) {
    case Event(Ping,"jibber") ?
      println("jibber")
      goto(Jibber) using "jabber"
    case Event(Done,s) ?
      println("Done jibbering")
      stop()
  }
}

object Run extends App {
  val system = ActorSystem("mySystem")
  val rattle = system.actorOf(Props[Monster])
  rattle ! Ping
  rattle ! Ping
  rattle ! Done
  Thread.sleep(100)
  system.shutdown()
}

(编辑:李大同)

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

    推荐文章
      热点阅读