2010-06-11 119 views
3

我需要为我想要在scala演员上检索的消息定义类吗?斯卡拉演员消息定义

我试图让这件事 我在哪里错了

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

回答

7

你可以把它作为一个正常的模式匹配,就像下面。

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

所以,是的,你应该首先定义它,使用消息对象没有参数和case类为那些有参数。 (正如西尔维奥·比尔曼所指出的,事实上,你可以使用任何可以模式匹配的东西,所以我稍微修改了这个例子)

以下是示例代码。

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" 
+0

这是很好的答案! 我想知道你从哪里得到这些信息。 因为在官方教程中,没有那么多的信息。 您是否阅读过“scala编程”书籍或其他网站? – benzen 2010-06-11 12:10:03

+0

@ BenZen 是的,我读了“scala编程”,它说接收的参数是一个部分函数。这意味着你可以使用模式匹配。 我建议你获得Martin Odersky编写的“Programming in Scala”的副本,这是一本很棒的书,并以全面的方式介绍Scala。 – 2010-06-12 00:12:11

4

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

对于除游戏码外的任何东西,我使用自定义不可变消息类(case-classes)。