Eclipseワークシート(2.10.1)でこれを試しました:
def a = { println("In a"); 3 } //> a: => Int
def b() = { println("In b"); 3 } //> b: ()Int
val c = () => { println("In c"); 3 } //> c : () => Int = <function0>
def test_type(x: => Int) = x //> test_type: (x: => Int)Int
test_type(a) //> In a
//| res0: Int = 3
b() //> In b
//| res1: Int = 3
c() //> In c
//| res2: Int = 3
test_type(b) //> In b
//| res3: Int = 3
// test_type(c) *** Doesn't compile
私は間違いなく何かが欠けています。a
とb
はどう違いc
ますか?(均一なアクセス原則?)a
の「名前による」代替であるように見えるので、 を呼び出すことはできませんが、なぜ型が異なるのでしょうか? と同様に、括弧なしで呼び出すこともできます (つまり、結果に評価されます) 。 )。val a = 3
a()
b
c
b
b
a
b
test_type
c
c
もう 1 つの質問ですが、Martin Odersky は彼のオンライン コースで、私が正しければ、次のような任意の匿名関数を() => 3
置き換えることができると言っています{ def f() = 3; f }
が、これら 2 つの式には異なる型と評価規則があり、最初に関数に評価され、次に -関数の結果、例:
val f2 = { def f() = 3; f } //> f2 : Int = 3