2014-02-08 77 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 –