Scala语法很难理解

时间:2016-10-04 13:02:02

标签: scala akka

我正在学习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)是什么意思?

3 个答案:

答案 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中的演员发送消息的唯一方式,但是也要问你需要在使用问题之前了解差异。