scalaのActor

中身を理解せずに見様見真似コード。

import scala.actors._

class Fib extends Actor {
  def act = {
    while(true) {
      receive {
        case i:Int => { 
          println(i + ":" + fib(i))
        }
      }
    }
  }
  def fib(n:Int):Int ={
    n match {
      case 0 => 1
      case 1 => 1
      case _ => fib(n - 1) + fib(n - 2)
    }
  }
}

object Main {
  def main(args: Array[String]) {
    val f = new Fib()
    f.start
    (0 to 10).foreach { c =>
      f ! c
    }
  }
}

元ねた、アクターモデル - GIOの日記

追記

trait Actor in scala.actorsによると無限ループはexitメソッドで脱出できるようだ。

Concurrency in Erlang & Scala: The Actor Model / Ruben Vermeersch (RubenV)

Actorについては、これが参考になりそう。

書き直し

import scala.actors._

case class Fib(i:Int)

class FibActor extends Actor {
  def act = {
    while(true) {
      receive {
        case Fib(i) => { 
          println(i + ":" + fib(i))
        }
        case Exit => {
          exit()
        }
      }
    }
  }
  def fib(n:Int):Int ={
    n match {
      case 0 => 1
      case 1 => 1
      case _ => fib(n - 1) + fib(n - 2)
    }
  }
}

object Main {
  def main(args: Array[String]) {
    val f = new FibActor()
    f.start
    (0 to 10).foreach { c =>
      f ! Fib(c)
    }
    f ! Exit
  }
}