gpt4 book ai didi

Scala case语法理解

转载 作者:行者123 更新时间:2023-12-04 17:54:31 25 4
gpt4 key购买 nike

我正试图掌握 Scala 的 actors (Akka),但我只是遇到了一些我不理解的奇怪的“case”用法:

import akka.actor.{ ActorRef, ActorSystem, Props, Actor, Inbox }
import scala.concurrent.duration._

case object Greet
case class WhoToGreet(who: String)
case class Greeting(message: String)

class Greeter extends Actor {

var greeting = ""

def receive = {
case WhoToGreet(who) => greeting = s"hello, $who"
case Greet => sender ! Greeting(greeting) // Send the current greeting back to the sender
}

}

特别是这一点:

  def receive = {
case WhoToGreet(who) => greeting = s"hello, $who"
case Greet => sender ! Greeting(greeting) // Send the current greeting back to the sender
}

现在我认为 scala 中的 case 语法看起来像这样:

something match {
case "val1" => println("value 1")
case "val2" => println("value 2")
}

如果我尝试像这样在 scala REPL 中复制有问题的用法:

def something = {
case "val1" => println("value 1")
case "val2" => println("value 2")
}

我明白了

error: missing parameter type for expanded function
The argument types of an anonymous function must be fully known. (SLS 8.5)

这到底是什么意思?

更新:这篇文章是迄今为止对我的问题的最佳答案:http://blog.bruchez.name/2011/10/scala-partial-functions-without-phd.html

最佳答案

scala 中的 Case 语法有多种形式。

一些例子是:

case personToGreet: WhoToGreet => println(personToGreet.who)
case WhoToGreet(who) => println(who)
case WhoToGreet => println("Got to greet someone, not sure who")
case "Bob" => println("Got bob")
case _ => println("Missed all the other cases, catchall hit")

您看到该错误的原因是因为您没有尝试在已知对象上调用 ma​​tch,而是尝试将 case block 分配给函数。

因为 Case block 在深处只是一个 PartialFunction,所以编译器认为您正在尝试定义一个部分函数,​​但没有给它足够的信息,因为它没有任何东西可以应用。

尝试这样的事情:

def something: PartialFunction[Any,Unit] = {
case "val1" => println('value 1")
case _ => println("other")
}

您将能够调用它。

编辑

Akka 示例中的案例之所以有效,是因为您实际上是在为抽象的、预先存在的函数提供实现:receive 在 akka.actor.Actor 中定义。您可以在 Akka source 中看到 typedef :

object Actor {
type Receive = PartialFunction[Any, Unit]
..
}

trait Actor {
def receive: Actor.Receive
....
}

示例中的接收调用被编译为

def receive: PartialFunction[Any, Unit] = {
}

这告诉我们 Receive 将获取任何值或引用并返回一个单位。

关于Scala case语法理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21646301/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com