2016-10-04 99 views
-2

我正在学习Scala和Akka,我基本上是Java程序员。我看到了各种语法,但很少有人无法理解。Scala语法很难理解

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

这只是一个【制法】(http://doc.akka.io/api/akka/current/index.html#[email protected](留言:任何) (implicitsender:akka.actor.ActorRef):Unit)call。方法可以(并且经常)在Scala中具有象征意义。 – alextsc

+0

好心解释!操作员会请。 – Sun

+0

这不是一个操作符,它只是一个方法调用。它调用'!'方法。就是这样。 –

回答

2

foo.bar(baz)可以写成Scala中的foo bar baz。请注意,我们在这里省略..是在这种情况下(情况下方法仅采用一个参数)可选

sender ! StringProcessedMsg(wordsInLine)可以理解为sender.!(StringProcessedMsg(wordsInLine))

但是对于实施

sender ! StringProcessedMsg(wordsInLine)类似于sender.tell(StringProcessedMsg(wordsInLine))

取自阿卡代码库

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) 
+0

谢谢,但还有一个疑问,如果您使用'!',它如何知道它必须调用'tell'方法,'tell'方法是任何默认方法或任何运算符重载方法来执行'tell'方法的工作。 – Sun

+0

@Ravi编辑了答案 – pamu

2

!运营商发送一条消息给一个演员Here is documentation

它不将消息发送到Scala的演员有也问,但是你需要了解使用要求所有的地方之前的分歧的唯一途径。

6

一对夫妇约斯卡拉语法的事情,应该帮助Java程序员:在斯卡拉

  • 方法名不必是字母数字。 !作为一个方法的有效名称,因为“富”

  • 实例和被引用的成员之间的点是可选的,围绕单个方法参数的括号也是可选的。 foo.bar("baz")相当于foo bar baz

考虑到这一点,注意sender ! StringProcessedMsg(wordsInLine)相同sender.!(StringProcessedMsg(wordsInLine)):它呼吁sender名为!方法,并传递StringProcessedMsg(wordsInLine)把它作为一个参数。

没有什么神奇:)