【问题标题】:Can functions in Scala be defined with def?Scala中的函数可以用def定义吗?
【发布时间】:2020-07-09 01:06:46
【问题描述】:

我发现在线资源说函数可以用术语 def 来定义,但这不会使函数成为方法吗?函数可以用val和def定义吗?也可以在 Singleton 或 Companion 对象中定义函数,因为方法位于要在类实例上调用的类中,或者可以在哪里定义函数?

【问题讨论】:

  • 查阅hereherehere找到的答案。
  • 可能该资源滥用术语函数来引用方法。但是,是的,正如您所看到的答案,您可以定义一个返回函数的方法。

标签: scala


【解决方案1】:

我发现在线资源说函数可以用术语 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定义吗?

它们可以用valdef 定义既不val 定义一个变量,def 定义一个方法。两者都没有定义函数。函数根本没有真正定义,它们是实例化的,因为它们和任何其他对象一样只是对象。

您不会说"Hello"“定义了一个字符串”,它只是“实例化”(或“创建”或“评估”)一个字符串。函数也是一样。 (x: Int) => 2 * _ 没有“定义”一个函数,而是实例化它。

也可以在 Singleton 或 Companion 对象中定义函数,因为方法位于要在类实例上调用的类中,或者可以在哪里定义函数?

同样,函数不是“定义”的。它们只是像任何其他对象一样的对象。你可以在任何地方都有一个函数,你可以有任何字符串、列表、整数等等。

[…] 方法位于类内部,可在类实例上调用 […]

这是错误的。方法可以定义在:

  • 特征
  • 对象
  • 包对象
  • 脚本
  • ……我可能忘记了什么

回到原来的问题:

我发现在线资源说函数可以用术语 def 来定义

你不应该相信你在网上读到的一切;-)

但是,说真的,开个玩笑,我可以想象为什么有人会这么说的几个原因:

  • 他们不明白方法和函数的区别。

  • 他们确实了解方法和函数之间的区别,但无论如何都将方法称为“函数”。

  • 他们指的是返回函数的方法,例如类似:

    def thisIsAMethod(a: Int, b: Int) = (a, b) => _ + _
    

    这是一个返回函数的方法。这不是用def 定义的函数。方法可以返回函数的事实是一个微不足道的陈述。函数是对象,当然方法也可以返回对象,否则就没用了。

  • 即使是 Scala 语言规范有时也使用术语“函数”来指代某种情况,无论是方法、局部函数还是绑定到函数对象的变量都无关紧要。因此,SLS 使用术语“函数”both 来指代 functionsand 来指代更一般的概念“某物可以称为”。这也无助于消除混乱。

【讨论】:

    猜你喜欢
    • 2013-11-05
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    • 2018-03-22
    • 2014-01-17
    相关资源
    最近更新 更多