2017-02-25 10 views
0

何が問題なのですか? 関数closureDemoを作成します。これは、任意のparamsを受け入れず、何も返さない別の関数を使用します。 私はclosureDemoを呼び出すと、この基準に一致する関数を渡します。 しかし、私は期待どおりの出力を得ることはできません。 -Scalaクロージャがどのように機能するのか分かりません

This is a demo application 
this is a demo for closure 

最初の行だけが印刷されます。 は、誰かがここに

object ScalaApp { 

    def main(args:Array[String]): Unit = { 
    println("This is a demo application") 
    closureDemo { 
    () => println("this is a demo for closure") 
    } 
    } 


    def closureDemo(op: => Unit) = { 
    op 
    } 
} 

おかげで、

アマール

答えて

3

opパラメータclosureDemoはコール名によって、あなたがそれを呼び出すまで、それが評価されないことを意味、です。 だがmainには、パラメータがゼロの関数である() => println(...)が渡されているので、これは問題ありません。 closureDemoの本文内では、opを呼び出すと関数が返されますが、関数は呼び出されません。

あなたはclosureDemoが呼び出すごとの名前のままにしたい場合は、あなたがそうのように、機能を渡すべきではありません。

closureDemo(println("this is a demo for closure")) 

をあなただけが後にしたいゼロのパラメータでclosureDemo機能を渡したい場合は、その署名には次の情報が反映されている必要があります。

def closureDemo(op:() => Unit) = { 
    op() 
} 
+1

実際にはここではクロージャは使用されておらず、外部変数を参照しない関数だけであることにも注意してください。 –

+0

私はこれを答えとして受け入れました。あなたの説明をありがとう –

+0

私はクロージャを使用していると思ったが、私は結局therに達すると思う –

2

closureDemoデモは名前によるパラメータを取るためですが何が起こっているか説明していただけます。 と、あなたが作成しているmain関数のclosureDemo呼び出しで、それを呼び出さないパラメータのない関数を定義しています。その新たに作成された機能の評価を強制することによって、あなたは

closureDemo { 
    (() => println("this is a demo for closure")).apply() 
} 

または代わりにあなたのclosureDemoへの入力は、関数が、名前によるパラメータ(コードブロック)

ではありませんので、あなたは、単に呼び出すことができます意図した結果を得ます
closureDemo(println("this is a demo for closure")) 
+0

これは受け入れられた回答に沿っています。私を助けてくれてありがとう。 –

関連する問題