Yin*_*ing 3 methods scala anonymous function named
我已经阅读了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节中返回表达式:"返回表达式返回e必须出现在一些封闭的命名方法或函数的主体内." 您还可以在同一页面和其他位置找到术语"命名函数".
所以我的问题是,在Scala中,做方法,命名方法和命名函数是指同一个概念吗?你在哪里得到命名函数的定义?
在代码中List(1, 2).map(_ + 1),原始表达式_ + 1是一个命名方法,然后将该方法转换为函数.什么样的函数,匿名函数,函数对象,命名函数?
根据我的理解,Scala只有两种类型的函数:作为方法的命名函数; 一个函数文字的匿名函数.函数文字被编译成特征FunctionN的函数对象,以便在纯粹的面向对象的Scala世界中使用.
但是,对于常规命名的funciton /方法(如_ + 1上面的代码中),为什么Scala会将其转换为另一个函数对象?
在语言层面,只有两个概念,
方法是Scala的基本构建块.方法总是被命名.方法生活在课堂或特质中.方法是JVM的原生构造,因此在Scala和Java中都是相同的.Scala中的方法(与函数不同)可能具有特殊功能:它们可以通过类型参数进行抽象,它们的参数可以具有默认值或者是隐式的,等等.
函数对象只是一个功能特性(实例Function1,Function2...).apply调用函数对象上的方法时,将评估该函数.有一些特殊的语法来定义未命名的"匿名"函数(又名"函数文字").函数只是一个值,因此可以命名(例如val f: (Int => Int) = (x => x)).类型A => B是简写Function1[A, B].
在链接的SO问题中,有人提到某些引用(如Scala规范)使用"函数"一词不精确地表示"方法"或"函数对象".我想部分原因是方法可以自动转换为函数对象,具体取决于上下文.但请注意,相反的转换没有意义:方法不是存在于具有自己独立存在的堆上的第一类值.相反,方法与定义它的类密不可分.
链接问题的答案相当好,但要解决您的具体问题:
def关键字定义的内容方法和函数之间的区别有点像Java中的int基元和盒装之间的区别Integer.
在一般性讨论中,听到两者都被描述为"整数"是很常见的.这通常是没有问题的,但是无论区别,你必须小心,准确是相关的.
同样,当程序需要时,方法将自动转换为Function(因此也就是对象),就像装箱原语一样.因此将方法称为函数并不完全错误.
UPDATE
那么它是怎样工作的?
当您尝试将方法作为参数传递给例如时List[A].map,编译器将生成一个派生的内部类(具有合成名称)Function1[A,B],以及一个apply委托给您最初提供的方法的方法.然后将其实例作为实际参数传递.