1

これが最小の例です

package org.example

import akka.actor._
import akka.pattern.ask
import akka.util.duration._
import akka.util.Timeout

class Counter extends Actor {
  def receive = {
    case _  => sender ! "hi"
  }
}

object AkkaProjectInScala extends App {
  val system = ActorSystem("AkkaProjectInScala")

  val counter = system.actorOf(Props[Counter])

  // this will raise NullPointerException    
  (counter ? "i just came to say hello") onSuccess {
    case x => println("He said " + x)
  }

  implicit val timeout = Timeout(5 seconds)
  system.shutdown()
}

コンソールでこのようなことをしようとすると、暗黙的にコンパイルエラーが発生するため、これは奇妙に思えます

scala> def magic(a: Int)(implicit b: Int) = a + b
magic: (a: Int)(implicit b: Int)Int

scala> magic(3)
<console>:9: error: could not find implicit value for parameter b: Int
              magic(3)

コンパイラがコンパイル時にこれを検出するのを防ぐ Akka を使用するときに発生する他の魔法はありますか?

4

2 に答える 2

1

使用したバージョンは記載していませんが、期間がに移動したため、Akka2.1ではないと思いますscala.concurrent。ただし、Scala2.10.1-RC3とAkka2.1では、コードをコンパイルしようとすると、ExecutionContext(でインポートできますimport scala.concurrent.ExecutionContext.Implicits.global)が見つからないと文句を言います。また、ask-patternの後に定義されたタイムアウトでコンパイルされませんでした。コンパイルの問題を解決した後、それは私にとってはうまくいきました。したがって、最新バージョンを使用することをお勧めします。

ここでも動作するコード-Akka2.1を使用

import scala.concurrent.duration._

import akka.actor._
import akka.dispatch._
import akka.util.Timeout
import akka.pattern.ask
import scala.concurrent.ExecutionContext.Implicits.global


class Counter extends Actor {
  def receive = {
    case _  => sender ! "hi"
  }
}

object AkkaProjectInScala extends App {
  val system = ActorSystem("AkkaProjectInScala")

  val counter = system.actorOf(Props[Counter])
  implicit val timeout = Timeout(5 seconds)

  val future = (counter ? "i just came to say hello") 
  future onSuccess {
    case x => println("He said " + x)
  }

  system.shutdown()
}
于 2013-03-15T18:00:29.770 に答える
1

メッセージの送信時にタイムアウトが初期化されていません。すべてvalは、ソース コードに表示される順序で初期化されます。メソッド本体の一部ではないコードは、メッセージ送信コードや の初期化などの「独立した」コードを含むコンストラクタ コードですtimeout。したがって、暗黙的は初期化される前に参照されます。

于 2013-03-15T13:45:37.367 に答える