gpt4 book ai didi

scala - 为什么在 Scala 中定义的没有空括号的函数的行为不像函数?

转载 作者:行者123 更新时间:2023-12-03 00:06:39 25 4
gpt4 key购买 nike

考虑以下 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,因为它已经是一个字符串。但是什么导致了这种行为呢?

最佳答案

您不是传递该方法,而是调用它,然后将其结果传递到调用中。

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

functionTakingFunction(TestObj1.testMethod _)

此处,testMethod 被转换为部分应用函数(称为“绑定(bind)”)。

您必须这样做的原因是因为 TestObj1.testMethod 不会评估为 function0 (这是需要传递给 functionTakingFunction >),但由于其声明方式(不带括号)而变为 String

它适用于 TestObj2,因为 testMethod 是用括号定义的,因此仅键入 TestObj2.testMethod 不会调用它。

关于scala - 为什么在 Scala 中定义的没有空括号的函数的行为不像函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18338636/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com