2014-02-08 41 views
3

我试图让Scala的演员(阿卡)一握,但我只是碰到“的情况下”使用的一些奇怪的是一点我不明白,就来了:Scala的情况下,语法的理解

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 
    } 

现在我想这种情况下,语法斯卡拉看起来是这样的:

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

如果我尝试复制使用情况在斯卡拉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) 

究竟是什么意思?

UPDATE:这篇文章是迄今为止最好的回答我的问题:http://blog.bruchez.name/2011/10/scala-partial-functions-without-phd.html

回答

3

案例语法Scala中有一些可以采取的形式。

是一些例子:

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块只是一个PartialFunction,所以编译器认为你试图定义一个局部函数,但没有给它足够的信息,因为它没有任何适用的东西。

尝试类似:

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

你就可以调用它。

编辑

在阿卡例子中的情况下工作,因为你实际上是一个抽象的,预先存在的功能提供了一个实现:接收akka.actor.Actor定义。你可以看到在Akka source typedef的:

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

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

例子中的接收呼叫被编译成

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

告诉我们,接收将采取任何数值或引用,并返回一个单元。

+0

那么我明白,用'匹配'它的工作原理,但我的问题仍然存在 - 为什么它没有'匹配'的Akka示例工作?我找不到任何在线语法的参考。 – Caballero

+0

对不起,我完全错过了你正在寻求澄清。编辑在一个答案:) – Damiya

+1

@Caballero它与'receive'一起工作的原因是因为你重写它,并且父类型'Actor'定义了函数的类型,它是'PartialFunction ...'。要定义您自己的部分函数,​​您只需定义正确的返回类型(PartialFunction)。有关示例,请参阅文档:http://www.scala-lang.org/api/2.10.3/index.html#scala.PartialFunction –