目录

​编辑

前言

正文

历史由来

Lambda演算

使用方法

C++语言中的Functions对象:

C#语言中的Lambda表达式:

总结


前言

我们经常所编程语言的的进步速度是落后于硬件的发展速度的。

但是最近几年,闭包语法在各个语言中都有自己的体现形式,如:

  •  C语言中使用函数指针作为回调函数的入口;

  •  Java和C#语言中的Lambda语法表达式;

  •  Objective-C语言中的Blocks语法;

  •  C#语言中的Delegates语法;

  •  C++语言中的Functions对象;


正文

历史由来

计算机的目的就是计算,也可以这样狭隘的理解,计算机要能完成可计算公式的计算和逻辑。要完成这样的事情,需要一套东西去支持。

阿隆佐邱奇(Alonzo Church)发明了Lambda演算,也就是λ演算

Lambda演算

λ演算(英语:lambda calculus,λ-calculus)是一套从数学逻辑中发展,以变量绑定和替换的规则,来研究函数如何抽象化定义、函数如何被应用以及递归的形式系统。

因为这里Lambda演算不是讨论的重点,我举几个简单的例子,让大家明白就好。

在Lambda演算中,每个表达式都代表一个函数,这个函数有一个参数,并且会返回一个值。也就是说在Lambda演算中只有函数。

  1. Lambda演算的基本定义:

    λx. E,x是参数,并且有且仅有一个参数,E是函数体。

  2. 函数的应用:

    E1 E2,E1是个函数,E2也是个函数,并且每个函数都有返回值,E2的返回值当成λx. E的x,带人到E1的函数中,在返回E1的结果。

这样还是很难理解,再来个个例子。

现在我们定义一个数学函数f(x) = x + 2,数学意义很明显,就给x加上2。怎么用Lambda演算弄?

  1. Lambda演算的基本定义:

    λx. x + 2,x是参数,x + 2函数体。

  2. 函数的应用:

    当有个参数λa.a 3的时候就是这个样子(λx. x + 2) (λa.a 3),可以写成也就符合上面的E1 E2格式。结果就是(λx. x + 2)3 = 3 + 2 = 5

这里有没有特别的熟悉,说说编程函数定义。

returnValue funcitonName(parameter){methodBody
}

假如这个函数只能传入一个参数,那么是不是就是 λx. E的简单表达,原来函数的由来可以这样追溯。

使用方法

C++语言中的Functions对象:

#include <iostream>
#include <string>
#include <vector>using namespace std;//构造string向量
vector<string> GetNameList()
{static vector<string> names;names.push_back("刘辉");names.push_back("李静波");names.push_back("崔亚允");names.push_back("赵雅");names.push_back("管辉");names.push_back("白志刚");names.push_back("王斌");names.push_back("白雅静");names.push_back("张浩");return names;
}void foo(string myname) {vector<string> names = GetNameList();//通过遍历string向量,使用闭包完成判断条件vector<string>::iterator i = find_if(names.begin(), names.end(), [&](const string& s){//判断操作值与参数相等是否相等return s == myname;});//输出判断得到的结果cout  <<(string)(*i) << endl;
}int main(int argc, const char * argv[]) {foo("刘辉");return 0;
}

1、声明闭包变量

C++中闭包的声明语法,要使用 function 类型来声明变量,如下所示:

 std::function<float(float)> colsure; 

其中,第一个 float 代表了闭包的返回值类型,第二个 float 代表了闭包的参数数据类型为浮点型

2、赋值闭包变量

C++中闭包的赋值语法,要使用 [=] 或 [&] 符号开头,如下所示:

colsure = [=](float f) {f += 10.0f;return f;
};

其中, [=] 代表了我们将要进行的闭包传值是单向赋值

[&] 在使用过程中,经常作为引用传值使用,如下所示:

std:function<float(float&)> col;
col = [&](float& f){f += 10.0f;return f;
};

3、使用闭包变量

使用 [=] 和 [&] 声明并且赋值后的闭包变量,在使用结束后的结果如下:

//声明一个浮点型变量
float floatValue = 1.0f;
//声明计算结果浮点型变量
float resultValue = 0.0f;//使用[=]类型的闭包变量
resultValue = colsure(floatValue);
//输入结果
std::cout<<floatValue<<":"<<resultValue<<endl;//使用[&]类型的闭包变量
resultValue = col(floatValue);
std::cout<<floatValue<<":"<<resultValue<<endl;

[=] 和 [&] 分别代表了值传递和引用传递的两种方式。


C#语言中的Lambda表达式:

Lambda表达式实在C#4中出现的语法糖,用来提高程序的开发效率,简化Func类型变量和delegate对象的写法。

常见的代码如下:

using System;
using System.Collections.Generic;namespace LambdaSample
{class MainClass{public static List<string> GetNameList(){List<string> names = new List<string> ();names.Add ("刘辉");names.Add ("崔亚允");names.Add ("李静波");names.Add ("赵雅");names.Add ("管辉");names.Add ("白志刚");return names;}public static void foo(string myname){//获取姓名列表List<string> names = GetNameList ();//通过Lambda表达式作为判断条件进行查询string result = names.Find ((x) => {return x == myname;});//输入查询结果Console.WriteLine(result);}public static void Main (string[] args){//测试foo ("崔亚允");}}
}

1、声明C#语言中的Lambda表达式变量

在C#语言中,可以通过 Func 类型来声明Lambda变量,如下所示:

Func<float,float> func;

或者使用 delegate 类型来声明Lambda变量,如下所示:

//定义一个delegate类型Interface
delegate float Interface(float x);public static void Main (string[] args)
{//使用Interface类型来声明Lambda变量Inteface inter_func;
}

2、赋值C#语言中的Lambda表达式变量

在C#语言中,使用 => goes to 运算符来生成变量,如下所示:

func = (x) => {x += 10.0f;return x;
};

=> goes to运算符的左边是闭包类型的浮点型参数,右边是闭包变量准备进行的逻辑运算,以 {} 包括。

3、使用C#语言中的Lambda表达式变量

和调用函数一样,如下所示:

//声明Func类型变量
Func<float,float> func;//为func赋值Lambda闭包
func = (x) => {x += 10.0f;return x;
};float floatValue = 1.0f;
float resultValue = 0.0f;//调用func变量,计算结果并且赋值给resultValue
resultValue = func (floatValue);//进行输出
Console.WriteLine (resultValue);

总结

其实在计算机科学中,闭包Closure)是词法闭包Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。

注意咯:

闭包一词经常和匿名函数混淆。这可能是因为两者经常同时使用,但是它们是不同的概念!

浅谈 Unity、iOS、Android 闭包的使用方法相关推荐

  1. audio unity 加速_浅谈Unity中Android、iOS音频延迟

    在Unity上面做音游,当在移动端实机运行起来,会发现,音频的发出会有一定的延迟,无论是长音效还是短音效,Unity内置的Audio内部使用的是FMOD,有以下手段改善 通过设置稍微改善其延迟的问题 ...

  2. 浅谈Unity与VR产业,用Unity开发VR应用

    VR(Virtual Reality的缩写,中文翻译-虚拟现实)概念早在80年代初就被提出来的,其具体是指借助计算机及最新传感器技术创造的一种崭新的人机交互手段. 中国VR产业仍在摸索阶段,亟缺复合型 ...

  3. 浅谈Unity与VR产业,用Unity开发第一款VR应用

    部分内容为整合与装载 浅谈VR VR(Virtual Reality的缩写,中文翻译-虚拟现实)概念早在80年代初就被提出来的,其具体是指借助计算机及最新传感器技术创造的一种崭新的人机交互手段. 中国 ...

  4. oracle hash join outer,CSS_浅谈Oracle中的三种Join方法,基本概念 Nested loop join: Outer - phpStudy...

    浅谈Oracle中的三种Join方法 基本概念 Nested loop join: Outer table中的每一行与inner table中的相应记录join,类似一个嵌套的循环. Sort mer ...

  5. 浅谈RAC -- 节点reboot问题的调查方法

    浅谈RAC – 节点reboot问题的调查方法 我们在上面的博文中介绍了CSS组件.今天我们继续围绕CSS组件的节点排除问题来总结一下常用的故障调查方法. 我们都知道CSS组件维护集群关系的两个最重要 ...

  6. python程序调用写好的代码_扣丁学堂浅谈Python编程中NotImplementedError的使用方法...

    扣丁学堂浅谈Python编程中NotImplementedError的使用方法 2018-07-04 14:08:02 2559浏览 本篇文章扣丁学堂 Python编程中raise可以实现报出错误的功 ...

  7. 手机热点设置虚拟服务器,以三款路由器为例,浅谈手机热点中继路由器的设置方法...

    以三款路由器为例,浅谈手机热点中继路由器的设置方法 2017-01-23 22:37:04 43点赞 328收藏 36评论 前言 各位值友,新年好! 这篇文章写一点路由使用心得.在此之前,我和许多人一 ...

  8. 浅谈C# 多态的魅力(虚方法,抽象,接口实现) ----转

    浅谈C# 多态的魅力(虚方法,抽象,接口实现) 2013-06-15      0 个评论       作者:做一个别人眼中的好人 收藏    我要投稿 前言:我们都知道面向对象的三大特性:封装,继承 ...

  9. java easing_浅谈jQuery animate easing的具体使用方法(推荐)

    从jQuery API 文档中可以知道,jQuery自定义动画的函数.animate( properties [, duration] [, easing] [, complete] )有四个参数: ...

  10. oracle全表扫过程讲解,CSS_浅谈存取Oracle当中扫描数据的方法,1) 全表扫描(Full Table Scans, FTS) - phpStudy...

    浅谈存取Oracle当中扫描数据的方法 1) 全表扫描(Full Table Scans, FTS) 为实现全表扫描,Oracle读取表中所有的行,并检查每一行是否满足语句的WHERE限制条件一个多块 ...

最新文章

  1. 国产研发管理工具也在慢慢壮大,Worktile7岁了!
  2. 一个web左侧菜单例子
  3. php 发送会议邮件,php – 为什么Outlook想删除以编程方式发送的当前会议邀请?...
  4. C#.NET 大型企业信息化系统 - 防黑客攻击 - SSO系统加固优化经验分享
  5. 洛谷 P1091 合唱队型
  6. 前端学习(2564):如何触发组件的更新
  7. 物流仿真在AGV调度方面应用案例
  8. Python数字图像处理
  9. C++实现FPS游戏辅助教程
  10. HttpClient数据传输的编码方式
  11. 论语 灵公篇(笔记)
  12. RV-LINK:GDB 使用 RV-LINK 仿真器调试 RISC-V 程序
  13. 所有身体器官的英文单词
  14. 后端开发如何快速转前端开发
  15. Tickeys -- 找对打字的感觉 (机械键盘音效软件)
  16. 计算机桌面截图怎么截,电脑如何截图,教您电脑截图怎么截
  17. 创新研发高通量芯片技术,JASMINER实现区块链芯片大突破
  18. 使用python预测基金_使用python先知3 1创建预测
  19. 踩实底子|每日学习|02-特征工程和文本特征提取【下】
  20. centos8使用技巧与阿贝云服务器

热门文章

  1. 安卓手机查看连接到热点设备的ip地址
  2. 华为nova5里面有用到鸿蒙吗,华为nova7se是不是鸿蒙系统?
  3. HTML旅游网站设计与实现——东江湖旅游网站6个网页HTML+CSS+JavaScript
  4. 追剧一个月赚了2万,在家用手机做短视频也能赚钱,步骤分享
  5. Galaxy S III是史上最强的Android手机?
  6. 奶茶果茶饮品店数字化转型| 奶茶店小程序 | 餐饮外卖系统
  7. 解决xlrd不能打开xlsx表格以及打开失败问题
  8. HTML5期末大作业:在线电影网站设计——我不是药神电影介绍(4页) HTML+CSS+JavaScript 大二实训大作业HTML源码
  9. 免费英文在线翻译-英文自动翻译
  10. CAD注记层转到SDE Annotation Features(ArcEngine,C++实现)(转载)