определение сообщения об актере scala - PullRequest
3 голосов
/ 11 июня 2010

Нужно ли мне определять класс для сообщения, которое я хочу получить на актере scala?

Я пытаюсь получить это, где я не прав

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

Ответы [ 2 ]

7 голосов
/ 11 июня 2010

Вы можете думать, что это нормальное сопоставление с шаблоном, как показано ниже.

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

Итак, да, вы должны сначала определить его, использовать объект для Message без параметров и класс 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"
4 голосов
/ 11 июня 2010

Строго нет, вы можете использовать любой объект в качестве значения сообщения. Сообщение может быть Int, String или Seq[Option[Double]], если хотите.

Для всего, кроме кода воспроизведения, я использую пользовательские неизменяемые классы сообщений (case-классы).

...