昨天被问及cocos2dx 3.0里面大量使用的lambda函数,我只能说上个函数指针,顿时朋友被鄙视了。。
下面是三篇描述这三种机制的文章,不去深究每一种语言的具体实现机制,但是要记住各自的用法。
像我这种初学者,有的说lua闭包只是一个函数的变量,可以修改函数的局部变量。block是一个对象,默认情况下可以访问函数局部变量,但是不能修改。C++lambda作为匿名函数,使用方法类似于函数指针。 这种乱七八杂的概念,一塌糊涂。。。。
lua闭包 http://blog.sina.com.cn/s/blog_547c04090100qfps.html
http://hi.baidu.com/wplzjtyldobrtyd/item/a293ac3c243e70ff97f88d07
可以访问和修改函数的局部变量
ios block http://li-bonan.blog.163.com/blog/static/135564770201281315927761/
Blocks可以访问局部变量,但是不能修改。
如果要修改必须如下定义局部变量: __block int multiplier = 7;
C++lambda函数 http://blog.youkuaiyun.com/srzhz/article/details/7934652 http://www.cnblogs.com/hujian/archive/2012/02/14/2350306.html
上面的博客中有lambda在for_each中的详细应用,引入了一批for_each的详细用法:http://www.cnblogs.com/Purple_Xiapei/archive/2012/05/27/2520477.html
想想一下代码的运行结果是什么:
int a = 42;
auto f = [a]{return a;};
a = 0;
std::cout<<f()<<std::endl;
答案是42. 为什么?请看下面
captures定义了各种变量截取的选项:
- [] 不截取任何变量
- [&} 截取外部作用域中所有变量,并作为引用在函数体中使用
- [=] 截取外部作用域中所有变量,并拷贝一份在函数体中使用
- [=, &foo] 截取外部作用域中所有变量,并拷贝一份在函数体中使用,但是对foo变量使用引用
- [bar] 截取bar变量并且拷贝一份在函数体重使用,同时不截取其他变量
- [this] 截取当前类中的this指针。如果已经使用了&或者=就默认添加此选项。
int a = 42;
auto f = [&a]{return a;};
a = 0;
std::cout<<f()<<std::endl;
现在结果就是0了。
for_each就是一个函数模板,在函数模板中做了自增的操作,所以只需要传入lambda函数就可。
template<typename InputIterator, typename Function>
Function for_each(InputIterator beg, InputIterator end, Function f) {
while(beg != end)
f(*beg++);
}
在后期的项目实践中多写,理清楚各种的用法吧。