函数字面量 vs 函数值

dip*_*rus 5 scala function

试图从 Scala 编程,第 2 版中找出本节的重要性。

函数文字被编译成一个类,当在运行时实例化时,该类是一个函数值。因此函数字面量和值之间的区别在于函数字面量存在于源代码中,而函数值在运行时作为对象存在。区别很像类(源代码)和对象(运行时)之间的区别。

我真的不明白他们在这里想说什么。源代码中不存在函数值并且运行时不存在函数文字?

// literal
val addOne = (x: Int) => x + 1

// value
def add1(x: Int): Int = x + 1
Run Code Online (Sandbox Code Playgroud)

我可以传递给另一个函数:

def doThing(thing: Int => Int) = thing(5)

doThing(addOne) // 6
doThing(add1)   // 6
Run Code Online (Sandbox Code Playgroud)

似乎函数文字也被放置到一个继承自的类中FunctionN(其中 N 是函数的元数)。他们试图在这里做出什么区别?

Yuv*_*kov 4

我真的不明白他们在这里想说什么。

您的函数文字和值的示例不准确。这本书并不是将方法函数进行比较,而是对函数的两种不同“模式”进行了区分。提示就在第一句:

函数文字被编译成一个类,在运行时实例化时它是一个函数值。

在编译时输入:

val addOne = (x: Int) => x + 1
Run Code Online (Sandbox Code Playgroud)

这就是本书所说的“函数文字”(或匿名函数)。与输入字符串文字的方式相同:

val s = "Hello, World"
Run Code Online (Sandbox Code Playgroud)

addOne对于编译器来说是 a Function1[Int, Int],意思是接受一个Int并返回一个Int结果。函数字面量语法 ( (x: Int) => x + 1) 是 的语法糖FunctionN,其中由函数的数量N决定。

在运行时,编译器通过实例化类型的对象来获取这个“函数文字”并“赋予它生命” Function1[Int, Int],从而创建一个可以调用、传递等的函数值。

他们试图在这里做出什么区分?

这本书基本上试图在函数的编译时和运行时表示之间进行区分,因此当他们说“函数文字”时,你会明白他们谈论的是前者,而当他们说“函数值”时,你会理解后者。