第一级值
长久以来一直不太明白之前在 lua 一本书中提到的 “第一类值”
直到今天在一本书上看到类似的解释:
一般而言, 程序设计语言总会对计算元素的可能使用方式强加上某些限制
带有最少限制的元素具有"第一级"的状态, 第一级元素的某些特权包括:
* 可以用变量命名
* 可以提供给过程作为参数
* 可以由过程作为结果返回
* 可以包含在数据结构中
上述说的是第一级值, 猜想应该是第一类值拥有第一级特权
第一类函数
以下摘自 wiki 对第一类函数(first-class function)的解释
In computer science, a programming language is said to have first- class functions if it treats functions as first-class citizens. This means the language supports passing functions as arguments to other functions, returning them as the values from other functions, and assigning them to variables or storing them in data structures
在计算机科学中, 一个编程语言如果对他函数就像第一类公民(??)一样, 那么就说他有第一类函数
这意味着语言支持将函数作为参数传递给其他函数
从其他函数中将其作为值返回
将其复制给变量, 或者保存到数据结构中
高阶函数
顺便 wiki 说了一下什么是高阶函数
First-class functions are a necessity for the functional programming style, in which the use of higher-order functions is a standard practice. A simple example of a higher-ordered function is the map function, which takes, as its arguments, a function and a list, and returns the list formed by applying the function to each member of the list. For a language to support map, it must support passing a function as an argument.
第一类函数对于函数化编程是必要的
其中使用高阶函数就是一个标准的实践
一个高阶函数的简单案例就是map函数
(...能意会, 但没法翻译...)
它必须支持传递函数作为参数
lambda 是如何工作的
1 | int main() { |
在上面基础上, 让 lambda 捕获局部变量和全局变量
1 | int gi = 11; |
其中关键之处在于对待全局变量的方式, 这有可能产生错误, 事实也的确错了
1 | printf("%d\n", f(1, 2) ); |
那么如果我加上 mutable 去更改这个 gi 呢?
1 | auto f = [i, gi](int x, int y) mutable { gi = 110; return i + gi + x + y; }; |
上述结果, 编译器(gcc 4.8.5)只有一个警告
但是如果不注意这个细节, 去捕获全局变量, 可能会有很严重的错误
接下来专注一下类类型变量, 他会如何捕获 (这里的代码就有点头疼了)
1 | int main() { |
值拷贝类的时候, 会将整个类拷贝一次, 并没有什么特殊的
匿名函数与其说是函数, 不如说是类 他就像一个重载了调用运算符的类一样