斯卡拉 – 是否有可能在阿卡组成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() } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |