为什么在没有空括号的情况下定义的Scala函数不像函数那样?

Ant*_*man 3 scala parentheses

考虑以下2个对象

object TestObj1 {
  def testMethod = "Some text"
}

object TestObj2 {
  def testMethod() = "Some text"
}
Run Code Online (Sandbox Code Playgroud)

如果我直接调用这些方法,他们就会按照我的期望行事

scala> TestObj1.testMethod
res1: String = Some text

scala> TestObj2.testMethod
res2: String = Some text
Run Code Online (Sandbox Code Playgroud)

但现在如果我们定义以下功能

def functionTakingFunction(callback: () => String) {
  println("Call returns: " + callback())
} 
Run Code Online (Sandbox Code Playgroud)

并尝试调用它,不接受没有()定义的方法.

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

scala> functionTakingFunction(TestObj2.testMethod)
Call returns: Some text
Run Code Online (Sandbox Code Playgroud)

我还注意到你不能使用括号调用TestObj1.testMethod,因为它已经是一个String.但是什么导致了这种行为?

om-*_*nom 9

您没有传递方法,您正在调用它,然后将其结果传递给调用.

如果要传递方法,首先必须将其转换为函数,然后传递:

functionTakingFunction(TestObj1.testMethod _)
Run Code Online (Sandbox Code Playgroud)

这里将testMethod其转换为部分应用的函数(称为"绑定").

你必须这样做的原因是因为TestObj1.testMethod不评估function0(需要传递给它functionTakingFunction),而是String因为它被声明的方式(没有括号).

它起作用,TestObj2因为testMethod是用括号定义的,因此只是键入TestObj2.testMethod不会调用它.

  • `testFunction`不是`Function`,它是一种方法.与方法一起使用时的部分应用程序产生`FunctionN`(其中N是从中派生它的方法的参数个数).模糊非第一类实体(方法)和第一类函数值之间的区别无助于理解. (3认同)