【问题标题】:Scala newbie, understanding Akka actor pattern matching exampleScala新手,了解Akka actor模式匹配示例
【发布时间】:2016-07-14 12:31:05
【问题描述】:

我是 Scala 新手。我对以下示例感到困惑。

class AClass extends Actor{
  def receive = {
    case B => println("Let's do B")
    case C => println("Let's do C")
  }
}

trait Request 
case object B extends Request 
case object C extends Request 

object Customer{ 

  def main(args: Array[String]) : Unit = { 

    val system = ActorSystem("Iwanttoeat") 
    val cook: ActorRef = system.actorOf(Props[CookSomething])
    cook ! B
    cook ! C
  } 
}

我有三个问题。

  1. 'receive' 方法没有输入参数。我匹配什么?我猜它来自'cook!乙'。 !意味着发送和忘记。 我很困惑,因为该方法没有明确提到输入参数,但是我将 B 或 C 与什么进行比较?

  2. 我看到了模式匹配示例。他们有“匹配”关键字。 大括号前是否省略了“匹配”?

3.[不是很重要]为什么'recieve'没有括号?我想知道为什么它不像 recieve() = {...} 我需要你的教导!

干杯

【问题讨论】:

  • Receive 是一个偏函数(准确地说是PartialFunction[Any, Unit]),{} 带有 case 语句的大括号只是在 scala 中定义它们的语法糖。请参阅the partial function doc 或使用此内容输入搜索引擎。
  • 谢谢你,亚历克斯的评论。我一直在思考。我在网上可以看到PartialFunction往往和模式匹配有关。

标签: scala pattern-matching akka


【解决方案1】:
  1. Akka Actor 的接收方法是一个带有签名PartialFunction[Any, Unit] 的部分函数,​​如Akka Documentation 中所述。在 Scala 中,部分函数可以用一种特殊的语法定义,省略输入变量并直接进行模式匹配。有关详细信息,请参阅Effective Scala
  2. 有关偏函数的特殊语法,请参见上面的评论。
  3. 在 Scala 中,您可以省略没有任何参数的方法的括号。

【讨论】:

  • 非常感谢您的友好回答。我现在明白了:) 我从你提到的链接中引用了以下内容。而不是,list map { item => item match { case Some(x) => x case None => default } } 折叠匹配列表 map { case Some(x) => x case None => default }
猜你喜欢
  • 2014-03-05
  • 2015-01-17
  • 1970-01-01
  • 2018-09-30
  • 2012-03-10
  • 1970-01-01
  • 2013-09-13
  • 2017-02-25
  • 1970-01-01
相关资源
最近更新 更多