繁体   English   中英

Scala案例语法理解

[英]Scala case syntax understanding

我试图控制Scala的演员(Akka),但我只是遇到了一些奇怪的“案例”用法,我不明白:

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")

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

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

尝试类似的东西:

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

而且你将能够调用它。

编辑

Akka示例中的情况有效,因为您实际上是为抽象的,预先存在的函数提供了一个实现:receive在akka.actor.Actor中定义。 您可以在Akka源中看到typedef:

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

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

示例中的receive调用被编译为

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

这告诉我们接收将采用任何值或参考并返回一个单位。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM