1

私たちがやるとしましょう

object Test {
    def main(args: Array[String]){
        println(() => "2pac")     // passing anon function 
        println((() => "shakur")()) // passing anon function, with empty args
        println(biggie)           // passing named function, no args
    }

    def biggie = "smalls"
}

印刷されます

<function>
shakur
smalls

名前付き関数と同じ型シグネチャを持つ無名関数が明示的な空の引数を必要とするのはなぜですか?biggie印刷されたときに呼び出されるのに、2pac関数が呼び出されないのはなぜですか?

4

1 に答える 1

11

行ごとに行きましょう:

println(() => "2pac")

ここでは、printlnに関数を渡しています。Scalaの関数は単なるオブジェクトであるため、printlnは型のtoStringメソッドを呼び出しているだけFunction0であり、常に出力されます<function>(実際には出力されます<function0>) 。

println((() => "shakur")())

ここで、に渡される前にanon関数を呼び出しているprintlnので、オブジェクトを受け取る代わりにFunction0、関数の戻り値を受け取り、文字列を出力するだけです。

println(biggie)

最後に、これはbiggie単なる。ではなく、 nullary関数です。つまり、関数は参照されるたびに実行され、明示的に呼び出しを必要としません。これは、空のパラメーターリストではなく、パラメーターリストなしで定義したためです。したがって、を呼び出すと、関数が評価され、その結果がに送信されます。Function0()println(biggie)biggieprintln

を呼び出すprintln(biggie _)と、アンダースコアはコンパイラに関数を評価しないように指示し、代わりに関数自体をに渡しますprintln。同様に、次のように定義biggieした場合:

def biggie() = "smalls"

呼び出すprintln(biggie)と、0引数のanon関数を渡すのと同じように動作します。

于 2013-03-04T22:27:50.343 に答える