0

どちらも挨拶方法は同じですか

object test {
  def greet = { println("hi")}                    //> greet: => Unit
  def greet1(f: => Unit)= {println("hi")}         //> greet1: (f: => Unit)Unit
}

私の理解によると、 greetは引数をとらず、Unit を返す関数であり、引数は名前で呼び出されます。そして、greet1は、Unit を返す関数を受け取る関数であり、そのパラメーターの名前による呼び出しでもあります。混乱しています。誰か親切に違いを説明できますか。

4

1 に答える 1

5

greet は unit を返すメソッドです。この特定のケースでは、機能的に同じことを行います。greet1 は Unit をパラメーターとして返す関数を取りますが、それを使用しません。したがって、greet1 を次のように呼び出すことができます。

greet1(greet)

そして、greet はパラメーターで渡されるため、適用されません。しかし、一般的にそれらは同じものではありません。greet1 を次のように変更した場合:

def greet1(f: => Unit)= {
  println("hi")
  f()
}

上記のようにgreet1を呼び出すと、「hi」が2回出力されます。または

def greet1(f: => Unit)= {
  println("hi")
  f()
  f()
}

「hi」を 3 回出力します。パラメータが呼び出されるたびにパラメータが評価されるため。greet1 を次のように書き換えるとします。

def greet1(f: Unit)= {
  println("hi")
  f
  f
} // and call it:

greet1(greet)

パラメータは値によって呼び出されるため、「hi」は2回しか出力されず、呼び出されたときに1回だけ評価されます。

于 2013-10-22T17:20:42.593 に答える