2016-12-19 161 views
2

我有一個函數不接受任何參數並返回一個部分函數。函數不接受任何參數

def receive:PartialFunction[Any,Unit]={ 
case "hello"=>println("Got it 1") 
case 123=>println("Got it 2") 
case true=>println("Got it 3") 
} 
receive("hello") 

我無法理解此函數調用語法。如何將字符串傳遞給接收函數以及大小寫函數如何執行?

但是,我無法理解下面的代碼,以及:

def receive():PartialFunction[Any,Unit]={ 
case "hello"=>println("Got it 1") 
case 123=>println("Got it 2") 
case true=>println("Got it 3") 
} 
val y=receive() 
y("hello") 

回答

3
  1. { case ... }一位不願具名的部分功能是短期的

    new PartialFunction[Any, Unit] { 
        def isDefinedAt(x: Any) = x match { 
        case "hello" => true 
        case 123 => true 
        case true => true 
        case _ => false 
        } 
    
        def apply(x: Any) = x match { 
        case "hello" => println("Got it 1") 
        case 123 => println("Got it 2") 
        case true => println("Got it 3") 
        } 
    } 
    

    [Any, Unit]來自於預期的類型在這種情況下)。

  2. 因爲receive不是帶參數的方法,receive("hello")receive.apply("hello")的簡稱。

+0

感謝您的明確代碼示例。 – codingsplash

+0

你能解釋爲什麼你在isDefinedAt()中添加了case _ => false嗎? Scala自動補充說,如果案例陳述中沒有案例_?你能給我一個關於這個的鏈接嗎?再次感謝! – codingsplash

+0

因爲'isDefinedAt'必須隨處定義。請參閱文檔http://www.scala-lang.org/api/2.12.1/scala/PartialFunction.html瞭解其含義。 –

1

我會嘗試解釋你的問題的第二部分。正如你所看到的,接收方法的兩個定義之間存在細微差別,一個帶括號而另一個不帶。因爲它是在前面的回答說,呼叫:

val func: Any => Any = ??? 
func(42) 

是由階分析器轉換到:

func.apply(42) 

這同樣適用於部分功能(和具有適用方法定義的任何類型的對象)。所以,你的調用是rewrtitten到這樣的事情:首先 :

val y = receive() 
y.apply("hello") 

二:

receive.apply("hello") 

也許你可以看到現在有什麼區別?當收到(空,但存在)括號時,不能寫receive.apply。

+0

非常感謝您的回答。 – codingsplash