【发布时间】:2020-07-09 01:06:46
【问题描述】:
我发现在线资源说函数可以用术语 def 来定义,但这不会使函数成为方法吗?函数可以用val和def定义吗?也可以在 Singleton 或 Companion 对象中定义函数,因为方法位于要在类实例上调用的类中,或者可以在哪里定义函数?
【问题讨论】:
标签: scala
我发现在线资源说函数可以用术语 def 来定义,但这不会使函数成为方法吗?函数可以用val和def定义吗?也可以在 Singleton 或 Companion 对象中定义函数,因为方法位于要在类实例上调用的类中,或者可以在哪里定义函数?
【问题讨论】:
标签: scala
我发现在线资源说函数可以用术语 def 来定义,但那不会使函数成为方法吗?
是的,def 定义了 方法,而不是 Scala 中的 函数。除非你说的是嵌套在方法中的局部函数:
def thisIsAMethod = {
val outerVal = 42
def thisIsANestedLocalFunction = {
println("Hello from local function")
outerVal
}
thisIsANestedLocalFunction
thisIsANestedLocalFunction
}
thisIsAMethod
// Hello from local function
// Hello from local function
//=> val res: Int = 42
函数可以用val和def定义吗?
它们可以用val 或def 定义既不。 val 定义一个变量,def 定义一个方法。两者都没有定义函数。函数根本没有真正定义,它们是实例化的,因为它们和任何其他对象一样只是对象。
您不会说"Hello"“定义了一个字符串”,它只是“实例化”(或“创建”或“评估”)一个字符串。函数也是一样。 (x: Int) => 2 * _ 没有“定义”一个函数,而是实例化它。
也可以在 Singleton 或 Companion 对象中定义函数,因为方法位于要在类实例上调用的类中,或者可以在哪里定义函数?
同样,函数不是“定义”的。它们只是像任何其他对象一样的对象。你可以在任何地方都有一个函数,你可以有任何字符串、列表、整数等等。
[…] 方法位于类内部,可在类实例上调用 […]
这是错误的。方法可以定义在:
回到原来的问题:
我发现在线资源说函数可以用术语 def 来定义
你不应该相信你在网上读到的一切;-)
但是,说真的,开个玩笑,我可以想象为什么有人会这么说的几个原因:
他们不明白方法和函数的区别。
他们确实了解方法和函数之间的区别,但无论如何都将方法称为“函数”。
他们指的是返回函数的方法,例如类似:
def thisIsAMethod(a: Int, b: Int) = (a, b) => _ + _
这是一个返回函数的方法。这不是用def 定义的函数。方法可以返回函数的事实是一个微不足道的陈述。函数是对象,当然方法也可以返回对象,否则就没用了。
即使是 Scala 语言规范有时也使用术语“函数”来指代某种情况,无论是方法、局部函数还是绑定到函数对象的变量都无关紧要。因此,SLS 使用术语“函数”both 来指代 functions,and 来指代更一般的概念“某物可以称为”。这也无助于消除混乱。
【讨论】: