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

Function 命名方法和命名函数的定义是什么?,function,scala,methods,anonymous,named,Function,Scala,Methods,Anonymous,Named,我读过这个问题和许多关于方法和函数之间差异的文章。我感觉“方法”只是一个“命名函数”,定义为类、特征或对象中的方法。“函数”表示这些文章中的“匿名函数”或“函数文字”或“函数对象”。可以在《Scala编程》一书第141页第8.1节中找到证据,“定义函数最常用的方法是作为某个对象的成员。这种函数称为方法。” 然而,当我检查Scala语言参考时,有一些概念,比如命名方法。在第91页的第6.20节返回表达式中:“返回表达式returne必须出现在一些命名为 方法或函数。”您还可以在同一页和其他地方找到

我读过这个问题和许多关于方法和函数之间差异的文章。我感觉“方法”只是一个“命名函数”,定义为类、特征或对象中的方法。“函数”表示这些文章中的“匿名函数”或“函数文字”或“函数对象”。可以在《Scala编程》一书第141页第8.1节中找到证据,“定义函数最常用的方法是作为某个对象的成员。这种函数称为方法。”

然而,当我检查Scala语言参考时,有一些概念,比如命名方法。在第91页的第6.20节返回表达式中:“返回表达式returne必须出现在一些命名为 方法或函数。”您还可以在同一页和其他地方找到术语“命名函数”

所以我的问题是,在Scala中,方法、命名方法和命名函数是否引用了相同的概念?从哪里获得命名函数的定义

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

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


但是,对于上面代码中的常规命名function/方法,如
\u1
,Scala为什么要将其转换为另一个函数对象

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

  • 方法是Scala的基本构建块。方法总是命名的。方法存在于类或特征中。方法是JVM固有的构造,因此在Scala和Java中都是相同的。Scala中的方法(与函数不同)可能有一些特殊的特性:它们可以通过类型参数进行抽象,它们的参数可以有默认值或是隐式的,等等

  • 函数对象只是函数特性(,…)的实例。调用函数对象上的
    apply
    方法时,将对函数进行求值。定义未命名的“匿名”函数(又称“函数文本”)有特殊的语法。函数只是一个值,因此可以命名(例如,
    valf:(Int=>Int)=(x=>x)
    )。类型
    A=>B
    Function1[A,B]
    的缩写


在本文中,有人提到一些参考文献(如Scala规范)使用“函数”一词的意思不准确,即“方法”或“函数对象”。我想部分原因是方法可以根据上下文自动转换为函数对象。但是,请注意,相反的转换是没有意义的:方法不是一个独立存在于堆上的一级值。相反,方法与定义它的类有着千丝万缕的联系。

链接问题的答案很好地涵盖了这一点,但为了解决您的具体问题:

  • 方法=>使用
    def
    关键字定义的内容
  • 命名方法=>同样,所有方法都有名称
  • 命名函数=>已赋值或已从方法转换的函数。与匿名函数相比
方法和函数之间的区别有点像Java中的
int
原语和装箱的
Integer
之间的区别

在一般的讨论中,通常会听到将两者都描述为“整数”。这通常不是一个问题,但是你必须注意在任何与区别相关的地方都要精确

同样,当您的程序需要某个方法时,该方法将自动转换为函数(从而转换为对象),就像装箱原语一样。因此,将方法称为函数并不是完全错误的

更新

那么它是如何工作的呢


当您尝试将方法作为参数传递给例如
List[a].map
时,编译器将生成一个派生
Function1[a,B]
的内部类(带有合成名称),以及一个委托给您最初提供的方法的
apply
方法。然后,该实例将作为实际参数传递。

函数->方法转换是不可避免的,所讨论的方法是函数类上定义的
apply
。非常像我的原始拳击类比:)我想说的不同:每个函数都代表一个在函数类实例上定义的
apply
方法。这里没有转换,函数就是这样定义的。另一方面,将方法转换成函数实际上是分配和构建了一些新的东西。我问这个问题是因为方法和函数术语的混合让我困惑——方法是函数吗?还是命名函数?或者根本不是一个函数?这个答案使用了最后一个定义,即方法不是函数。从Scala语言规范来看,这个定义是不正确的(参见上面的问题)。这是我试图澄清的,你是对的:“函数”在非技术意义上被用作方法和函数对象的通用术语。更新了答案以澄清这一点。拳击比较有帮助。我知道Scala需要将函数文字转换为FunctionTN的方法,因为Scala是一种OO语言。但是,如果您提供了一个常规对象方法,为什么Scala会将一个方法“装箱”到另一个方法中呢?一个方法永远不会“装箱”到另一个方法中,而只会“装箱”到一个函数中。当您将方法指定为例如
列表[a].map的参数时,它实际上是作为函数传递的<