考虑以下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.但是什么导致了这种行为?
您没有传递方法,您正在调用它,然后将其结果传递给调用.
如果要传递方法,首先必须将其转换为函数,然后传递:
functionTakingFunction(TestObj1.testMethod _)
Run Code Online (Sandbox Code Playgroud)
这里将testMethod其转换为部分应用的函数(称为"绑定").
你必须这样做的原因是因为TestObj1.testMethod不评估function0(需要传递给它functionTakingFunction),而是String因为它被声明的方式(没有括号).
它起作用,TestObj2因为testMethod是用括号定义的,因此只是键入TestObj2.testMethod不会调用它.
| 归档时间: |
|
| 查看次数: |
1217 次 |
| 最近记录: |