【发布时间】:2017-03-07 05:57:33
【问题描述】:
来自 Eugene Burmako 的 a paper:
在 Akka,一个 [...],actor 通常使用无类型的
tell方法进行交互。由于参与者能够相互发送任意类型的消息,因此类型信息会在接收方丢失,并且通常只能使用模式匹配、放松类型保证来恢复。
他在这里指的是什么保证,为什么模式匹配会削弱它们?
【问题讨论】:
标签: scala pattern-matching type-inference
来自 Eugene Burmako 的 a paper:
在 Akka,一个 [...],actor 通常使用无类型的
tell方法进行交互。由于参与者能够相互发送任意类型的消息,因此类型信息会在接收方丢失,并且通常只能使用模式匹配、放松类型保证来恢复。
他在这里指的是什么保证,为什么模式匹配会削弱它们?
【问题讨论】:
标签: scala pattern-matching type-inference
这是一个简单的 akka 示例(来自:here)
import akka.actor._
class HelloActor(myName: String) extends Actor {
def receive = {
case "hello" => println("hello from %s".format(myName))
case _ => println("'huh?', said %s".format(myName))
}
}
object Main extends App {
val system = ActorSystem("HelloSystem")
val helloActor = system.actorOf(Props(new HelloActor("Fred")), name ="helloactor")
helloActor ! "hello"
helloActor ! "buenos dias"
}
HelloActor 中的接收函数采用 Any 类型。 (从技术上讲,它是从 Any 到 Unit 的部分函数)。这意味着要了解它的类型,我们需要进行模式匹配。我可以向 HelloActor 发送一个 Int 并且编译器不会阻止我。如果我只是有一个接受字符串的普通函数,那么编译器会检测到它。我相信这句话所指的是缺乏类型安全。
有类型化的 akka 演员,但我从未使用过它们,也不确定它们的含义。
【讨论】:
A Spoty Spot 的答案告诉您丢失了哪些保证,但“为什么模式匹配会削弱它们”的答案是它没有。你稍微误读了句子。而不是
模式匹配,放松类型保证
读作
类型信息在接收方丢失,并且通常只能使用模式匹配来恢复,放松类型保证
“并且通常只能恢复...”是parenthetical。
【讨论】: