什么是Lambda?
C++ 11加入了一个非常重要的特性——Lambda表达式。营里(戴维营)的兄弟都对Objective-C很熟悉,许多人多block情有独钟,将各种回调函数、代理通通都用它来实现。甚至有人选择用FBKVOController、BlocksKit等开源框架将KVO、控件事件处理都改为通过block解决。原因就是简单、方便、直观,函数的定义和使用出现在同一个地方。这里的Lambda表达式实际上和block非常类似,当然如果你用它和Swift语言的闭包比较,那就是一回事了。下面先看几个Lambda和block的示例代码。
1 .Objective-C的block示例代码,使用^
表示block类型,总体来说与函数指针的定义类似。
#import <Foundation/Foundation.h>
int main()
{
void (^block)() = ^void() {
NSLog(@"In block");
};
block();
return 0;
}
编译运行:
$ clang main.m -framework Foundation
$ ./a.out
2015-01-28 14:17:52.763 a.out[9901:165707] In block
2 .Swift的闭包,参数列表、返回值类型等都写在花括号{}
内部。
let closure = {
() -> Void in
println("In swift")
}
closure()
编译运行:
$ swiftc main.swift
$ ./main
In swift
测试Swift也可以直接使用Playground或REPL(Read-Eval-Print-Loop)环境。
3 .C++的Lambda表达式。
#include <iostream>
int main()
{
auto lambda = []() -> void{
std::cout << "In lambda" << std::endl;
};