我正在学习Scala和Akka,我基本上是Java程序员。我看到了各种语法,但很少有我无法理解。
case class ProcessStringMsg(string: String)
case class StringProcessedMsg(words: Integer)
class StringCounterActor extends Actor {
def receive = {
case ProcessStringMsg(string) => {
val wordsInLine = string.split(" ").length
sender ! StringProcessedMsg(wordsInLine)
}
case _ => println("Error: message not recognized")
}
}
这里,sender ! StringProcessedMsg(wordsInLine)
是什么意思?
答案 0 :(得分:6)
有关scala语法的一些内容应该有助于java程序员:
scala中的方法名称不必是字母数字。 !
是方法的有效名称,因为" foo"
实例和被引用的成员之间的点是可选的,括号也是可选的,围绕单个方法参数。 foo.bar("baz")
相当于foo bar baz
考虑到这一点,请注意sender ! StringProcessedMsg(wordsInLine)
与sender.!(StringProcessedMsg(wordsInLine))
相同:它会在!
上调用名为sender
的方法并将StringProcessedMsg(wordsInLine)
传递给它作为参数。
没什么神奇的:)
答案 1 :(得分:2)
foo.bar(baz)
可以在Scala中写为foo bar baz
。请注意,我们在这里省略了.
。在这种情况下.
是可选的(方法只需要一个参数的情况)
sender ! StringProcessedMsg(wordsInLine)
可以理解为sender.!(StringProcessedMsg(wordsInLine))
但是关于实施
sender ! StringProcessedMsg(wordsInLine)
类似于sender.tell(StringProcessedMsg(wordsInLine))
取自akka codebase
final def tell(msg: Any, sender: ActorRef): Unit = this.!(msg)(sender)
override def !(message: Any)(implicit sender: ActorRef = Actor.noSender): Unit =
actorCell.sendMessage(message, sender)
答案 2 :(得分:2)
!
运算符向角色Here is documentation
它不是向Scala中的演员发送消息的唯一方式,但是也要问你需要在使用问题之前了解差异。