3

次の2つのオブジェクトを検討してください

object TestObj1 {
  def testMethod = "Some text"
}

object TestObj2 {
  def testMethod() = "Some text"
}

これらのメソッドを直接呼び出すと、期待どおりの結果が得られます

scala> TestObj1.testMethod
res1: String = Some text

scala> TestObj2.testMethod
res2: String = Some text

しかし今、次の関数を定義すると

def functionTakingFunction(callback: () => String) {
  println("Call returns: " + callback())
} 

() なしで定義されたメソッドは受け入れられません。

scala> functionTakingFunction(TestObj1.testMethod)
<console>:10: error: type mismatch;
 found   : String
 required: () => String
              functionTakingFunction(TestObj1.testMethod)
                                              ^

scala> functionTakingFunction(TestObj2.testMethod)
Call returns: Some text

また、TestObj1.testMethod は既に文字列であるため、括弧を使用して呼び出すことはできないことにも気付きました。しかし、この動作の原因は何ですか?

4

3 に答える 3

9

メソッドを渡すのではなく、メソッドを呼び出してから、その結果を呼び出しに渡します。

メソッドを渡したい場合は、まずそれを関数に変換して渡す必要があります。

functionTakingFunction(TestObj1.testMethod _)

ここでは、 が部分的に適用されtestMethodた関数に変換されます (「結合」と呼ばれます)。

あなたがそれをしなければならない理由は、 (これは に渡す必要があるものです)にTestObj1.testMethod評価されず、(括弧なしで)宣言されている方法のために a に評価されるからです。function0functionTakingFunctionString

TestObj2testMethod は括弧で定義されているため、入力するだけでは呼び出されないため、機能TestObj2.testMethodします。

于 2013-08-20T15:13:19.110 に答える
0

functionTakingFunction(TestObj1.testFunction)として呼び出されますfunctionTakingFunction("Some text")- 渡されるのではなく評価されます

于 2013-08-20T15:12:42.537 に答える