scala - 没有参数的scala方法中的模式匹配

我最近研究了 scala 多线程教程,偶然发现了一个在 Actor 中实现的方法:

class MyActor extends Actor
  def receive = {
    case "test" => println("received test")
    case _ =>      println("received unknown message")
  }
}

虽然我认为我知道该方法的作用,但我不知道如何使用这种方法(因为它不接受任何参数)。

虽然这个例子是关于 Akka 的,但我认为这与 Akka 无关

最佳答案

实际上 receive 返回部分函数。当您检查 Actor 的源代码时,您会看到;

type Receive = PartialFunction[Any, Unit]

因此,这意味着通过重写接收,您提供了一个部分函数,​​它接受任何参数和返回单元。稍后,如果您的 actor 收到消息,Akka 本身将使用此部分函数对传入消息进行模式匹配。

-- 编辑--

对于更具体的示例,假设您创建了一个类似的对象;

object Obj {
  def receive: PartialFunction[Any, Unit] = {
    case "test" => println("test case")
    case 1 => println("int 1 case")
    case d: Double => println("double case $d")
    case _ => println("rest")
  }
}

然后你可以像调用常规方法一样调用这个偏函数;

scala> Obj.receive(1)
int 1 case
scala> Obj.receive("test")
test case

Actor case 是特定的,只是你不直接调用接收,你提供它,如果消息到达,Akka 自己调用它;

protected[akka] def aroundReceive(receive: Actor.Receive, msg: Any): Unit = receive.applyOrElse(msg, unhandled)

当然这个调用取决于很多参数,比如你使用的拓扑结构,邮箱等等。

https://stackoverflow.com/questions/40800074/

相关文章:

css - 从 Chrome 开发者工具样式更改输入占位符颜色

haskell - 如何将整数插入排序列表

laravel - 在 Laravel 5 中间件中获取 cookie

macos - ld 链接器错误 - 体系结构 x86_64 的 undefined symbol

apache-spark - 星火迷你集群

lua - 如何在lua中使用多个文件

batch-file - "nircmd.exe monitor on"不工作

.net - AWS Polly 集成 SDK

R - 在没有分配的情况下构建具有多列的数据框

python - Airflow -BashOperator : Getting "Dag runs