function - 命名方法和命名函数的定义是什么?

标签 function scala methods anonymous named

我已阅读问题 Difference between method and function in Scala以及许多关于方法和功能之间差异的文章。我有一种感觉,“方法”只是定义为类、特征或对象中的方法的“命名函数”。 “函数”代表这些文章中的“匿名函数”或“函数文字”或“函数对象”之类的东西。可以在《Scala 编程》一书中找到证据http://www.artima.com/shop/programming_in_scala_2ed ,第 141 页,第 8.1 节,“定义函数的最常见方法是作为某个对象的成员。这样的函数称为方法。”

但是,当我查看 Scala 语言引用 http://www.scala-lang.org/docu/files/ScalaReference.pdf 时,有命名方法之类的概念。在第 91 页的第 6.20 节返回表达式中:“返回表达式 return e 必须出现在某些封闭命名的主体内
方法或函数。”您还可以在同一页面和其他地方找到术语“命名函数”。

所以我的问题是,在 Scala 中,方法、命名方法和命名函数是指同一个概念吗?你从哪里得到命名函数的定义?

在代码中 List(1, 2).map(_ + 1) , 原文表达 _ + 1是一个命名方法,然后该方法被转换为一个函数。什么样的函数,匿名函数,函数对象,命名函数?

在我的理解中,Scala 只有两种类型的函数:一个是方法的命名函数;作为函数字面量的匿名函数。函数字面量被编译成 trait FunctionN 的函数对象,以便在纯面向对象的 Scala 世界中使用。

但是,对于常规的命名函数/方法,例如 _ + 1在上面的代码中,为什么Scala将其转换为另一个函数对象?

最佳答案

在语言层面,只有两个概念,

  • 方法是 Scala 的基本构建块。方法总是被命名的。方法存在于类或特征中。方法是 JVM 固有的构造,因此在 Scala 和 Java 中是相同的。 Scala 中的方法(与函数不同)可能有一些特殊的特性:它们可以对类型参数进行抽象,它们的参数可以具有默认值或隐式等。
  • 函数对象只是函数特征的实例( Function1 Function2 ,...)。该函数在 apply 时被评估函数对象上的方法被调用。定义未命名的“匿名”函数(又名“函数文字”)有特殊的语法。函数只是一个值,因此可以命名(例如, val f: (Int => Int) = (x => x) )。型号A => BFunction1[A, B] 的简写.

  • linked SO question ,有人提到一些引用文献(如 Scala 规范)不准确地使用“函数”一词来表示“方法”或“函数对象”。我想部分原因是方法可以根据上下文自动转换为函数对象。但是请注意,相反的转换是没有意义的:方法不是存在于堆上并独立存在的一流值。相反,方法与定义它的类密不可分。

    关于function - 命名方法和命名函数的定义是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7343625/

    相关文章:

    scala - 匹配,案例与逻辑?

    java - Java 是 "pass-by-reference"还是 "pass-by-value"?

    python - 如何在类初始化期间添加在字符串中编码的动态方法?

    javascript - 无法获取按钮的onclick属性来调用JS函数

    javascript - 将功能连接到 PC 文件夹中显示的图片

    sql - 检查后从表中返回值的 PL/SQL 函数

    scala - 使用 sttp 的多部分表单数据请求 - Scala HTTP 客户端

    mysql - Nodejs 在函数执行之间等待

    scala - 如何使用 scala play 为 OAuth1.0a 的 POST 签名?

    powershell - Invoke-CimMethod 的无效(静态)方法