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

时间:2011-09-08 05:48:33

标签: 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节中找到,“定义函数的最常用方法是作为某个对象的成员。这样的函数称为方法。” / p>

但是,当我检查Scala语言参考http://www.scala-lang.org/docu/files/ScalaReference.pdf时,会有像命名方法这样的概念。在页91,第6.20节中返回表达式:“返回表达式返回e必须出现在一些封闭的名称的主体内 方法或功能。“你也可以在同一页面和其他地方找到”命名函数“一词。

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

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

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

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

2 个答案:

答案 0 :(得分:7)

链接问题的答案非常清楚,但要解决您的具体问题:

  • method =>您使用def关键字
  • 定义的内容
  • 命名方法=>同样,所有方法都有名称
  • named function =>已分配给值或从方法转换的函数。与匿名函数形成鲜明对比。

方法和函数之间的区别有点像Java中int原语和盒装Integer之间的区别。

在一般性讨论中,听到两者都被描述为“整数”是很常见的。这通常不是问题,但您必须注意在 相关区别时保持准确。

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

<强>更新

那它是如何运作的?

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

答案 1 :(得分:6)

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

  • 方法是Scala的基本构建块。方法总是命名。方法生活在课堂或特质中。方法是JVM的原生构造,因此在Scala和Java中都是相同的。 Scala中的方法(与函数不同)可能具有特殊功能:它们可以通过类型参数进行抽象,它们的参数可以具有默认值或隐式等等。

  • 函数对象只是函数特征的实例(Function1Function2,...)。调用函数对象上的apply方法时,将评估该函数。有一些特殊的语法来定义未命名的“匿名”函数(又名“函数文字”)。函数只是一个值,因此可以命名(例如,val f: (Int => Int) = (x => x))。类型A => BFunction1[A, B]的缩写。

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