2016-12-19 23 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 ... }のような匿名の部分関数は([Any, Unit]が期待されるタイプから来

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

    の略ですこの場合は

  2. receiveはパラメータ付きのメソッドではありません。receive("hello")receive.apply("hello")の略です。

+0

クリアコードの例をありがとう。 – codingsplash

+0

isDefinedAt()にcase = => falseを追加した理由を説明できますか? case文に_がない場合、scalaは自動的にそれを追加しますか?あなたは私にそれについてのリンクを教えてもらえますか?再度、感謝します! – codingsplash

+0

'isDefinedAt'はどこにでも定義する必要があるためです。それが意味することについては、ドキュメントhttp://www.scala-lang.org/api/2.12.1/scala/PartialFunction.htmlを参照してください。 –

1

質問の第2部分を説明しようとします。あなたが見ることができるように、受信方法の2つの定義の間には小さな違いがあります。それは前の回答で述べたように、呼び出し:

func.apply(42) 
部分関数の真

同じ保持(およびメソッド定義を適用有する任意のタイプのオブジェクト):

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

のにScalaのパーサによって変換されます。

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

第二:: まず:

receive.apply("hello") 

は、たぶん、あなたが今の違いを見ることができますので、あなたの呼び出しはこのような何かにrewrtittenていますか? receive(empty、しかしexisting)括弧があるときは、receive.applyを書くことはできません。

+0

お返事ありがとうございました。 – codingsplash

関連する問題