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它不评估为function0(这是需要传递给的functionTakingFunction),而是String因为它的声明方式(不带括号)。

它之所以起作用,TestObj2是因为 testMethod 是用括号定义的,因此仅键入TestObj2.testMethod不会调用它。

于 2013-08-20T15:13:19.110 回答
0

functionTakingFunction(TestObj1.testFunction)被称为functionTakingFunction("Some text")- 它被评估而不是通过

于 2013-08-20T15:12:42.537 回答
-1

在这里,您没有传递函数。您要做的是评估TestObj1.testFunction然后将该结果传递给functionTakingFunction 但是如果您看到 functionTakingFunction 的定义,它会清楚地说明

def functionTakingFunction(callback: () => String)

表示此函数需要一个返回类型为单位的函数。但是TestObj1.testFunction没有返回类型。

Unit Return Type 和 No Return Type 的区别在于:

  • 没有返回类型意味着这个方法不会返回任何东西
  • 单位返回类型意味着此方法将返回没有意义的值。

希望现在对你有帮助。快乐编码,享受 Scala。

于 2013-08-20T19:58:31.873 回答