【问题标题】:scala actor message definitionscala演员消息定义
【发布时间】:2010-06-11 00:34:56
【问题描述】:

我是否需要为要在 Scala 演员上检索的消息定义类?

我试图解决这个问题 我哪里错了

  def act() {  
    loop {  
      react {  
        case Meet => foundMeet = true ;   goHome  
        case Feromone(qty) if (foundMeet == true) => sender ! Feromone(qty+1); goHome  
   }}}

【问题讨论】:

    标签: scala message actor


    【解决方案1】:

    您可以将其视为普通模式匹配,如下所示。

    match (expr)
    {
       case a =>
       case b =>
    }
    

    所以,是的,你应该先定义它,对没有参数的消息使用对象,对有参数的消息使用案例类。 (正如 Silvio Bierman 指出的,事实上,您可以使用任何可以进行模式匹配的东西,所以我对这个示例进行了一些修改)

    以下是示例代码。

    import scala.actors.Actor._
    import scala.actors.Actor
    
    object Meet
    case class Feromone (qty: Int)
    
    class Test extends Actor
    {
        def act ()
        {
            loop {
                react {
                    case Meet => println ("I got message Meet....")
                    case Feromone (qty) => println ("I got message Feromone, qty is " + qty)
                    case s: String => println ("I got a string..." + s)
                    case i: Int => println ("I got an Int..." + i)
                }
            }
        }
    }
    
    val actor = new Test
    actor.start
    
    actor ! Meet
    actor ! Feromone (10)
    actor ! Feromone (20)
    actor ! Meet
    actor ! 123
    actor ! "I'm a string"
    

    【讨论】:

    • 这个答案很好!!我想知道你是从哪里得到这些信息的。因为在官方教程上,没有那么多资料。您是否阅读过“scala 编程”一书或其他网站??
    • @BenZen 是的,我读过“scala 中的编程”,它说接收的参数是一个部分函数。这意味着您可以在其上使用模式匹配。我建议你买一本 Martin Odersky 写的“Scala 编程”,这是一本很棒的书,它以全面的方式介绍了 Scala。
    【解决方案2】:

    严格来说,您可以使用任何对象作为消息值。如果您愿意,消息可以是 IntStringSeq[Option[Double]]

    除了玩转代码之外,我使用自定义的不可变消息类(案例类)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-05
      • 1970-01-01
      • 2012-10-31
      • 1970-01-01
      • 2018-09-29
      • 2016-09-04
      • 2014-12-02
      • 1970-01-01
      相关资源
      最近更新 更多