Мне интересно, почему метод приема akka Actor в этом коде ведет себя как val?Почему метод приема в акке ведет себя как val?
import akka.actor.{ ActorRef, ActorSystem, Props, Actor }
import scala.concurrent.duration._
// Define Actor Messages
case class WhoToGreet(who: String)
// Define Greeter Actor
class Greeter extends Actor {
def receive = {
println("in receive")
receiveHandler
}
def receiveHandler: Receive = {
case WhoToGreet(who) => println(s"Hello $who")
}
}
object HelloAkkaScala extends App {
// Create the 'hello akka' actor system
val system = ActorSystem("Hello-Akka")
// Create the 'greeter' actor
val greeter = system.actorOf(Props[Greeter], "greeter")
// Send WhoToGreet Message to actor
greeter ! WhoToGreet("Akka")
greeter ! WhoToGreet("Akka")
greeter ! WhoToGreet("Akka")
//shutdown actorsystem
system.terminate()
}
Выход:
in receive
Hello Akka
Hello Akka
Hello Akka
, когда он должен быть:
in receive
Hello Akka
in receive
Hello Akka
in receive
Hello Akka
во время приема является опр.
Любое представление об этом поведении, почему def здесь вычисляется как val?
Спасибо, но почему в этом [код] (https://www.jdoodle.com/embed/v0/scala/2.12.0/14e) он ведет себя как def? – SaKou
Код, к которому вы привязаны, полностью не связан с PartialFunctions, вы можете это доказать, изменив тип возврата на Unit. Ваши методы выполняют побочные эффекты (printlns) за пределами PartialFunction. Акка вызывает (кэшированную) PartialFunction. –
Не могли бы вы посмотреть в приведенном выше коде, я изменил тип Partial на: type Partial = PartialFunction [Any, Unit] Я не вижу разницы – SaKou