浅谈 Unity、iOS、Android 闭包的使用方法

简介: 浅谈 Unity、iOS、Android 闭包的使用方法

image.png

前言


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

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

  •  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

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

1. returnValue funcitonName(parameter){
2.   methodBody
3. }

假如这个函数只能传入一个参数,那么是不是就是 λ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)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。

注意咯:

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


目录
相关文章
|
3天前
|
存储 安全 Android开发
探索Android与iOS的隐私保护机制
在数字化时代,移动设备已成为我们生活的一部分,而隐私安全是用户最为关注的问题之一。本文将深入探讨Android和iOS两大主流操作系统在隐私保护方面的策略和实现方式,分析它们各自的优势和不足,以及如何更好地保护用户的隐私。
|
3天前
|
安全 数据安全/隐私保护 Android开发
探索Android与iOS的隐私保护策略
在数字时代,智能手机已成为我们生活中不可或缺的一部分,而随之而来的则是对个人隐私和数据安全的日益关注。本文将深入探讨Android与iOS两大操作系统在隐私保护方面的策略和实践,分析它们如何应对日益严峻的隐私挑战,以及用户应如何保护自己的数据安全。通过对比分析,我们将揭示两大系统在隐私保护方面的优势和不足,为用户提供有价值的见解和建议。
|
3天前
|
Android开发 Swift iOS开发
深入探索iOS与Android操作系统的架构差异及其对应用开发的影响
在当今数字化时代,移动设备已经成为我们日常生活和工作不可或缺的一部分。其中,iOS和Android作为全球最流行的两大移动操作系统,各自拥有独特的系统架构和设计理念。本文将深入探讨iOS与Android的系统架构差异,并分析这些差异如何影响应用开发者的开发策略和用户体验设计。通过对两者的比较,我们可以更好地理解它们各自的优势和局限性,从而为开发者提供有价值的见解,帮助他们在这两个平台上开发出更高效、更符合用户需求的应用。
|
4天前
|
前端开发 Android开发 开发者
探索Android与iOS的跨平台开发策略
在当今多元化的移动设备市场中,开发者面临着为不同操作系统设计应用的挑战。本文深入探讨了Android和iOS两大主流平台的跨平台开发策略。我们将分析使用Flutter、React Native等框架进行跨平台开发的优劣,并讨论如何克服各平台间的差异性,以实现高效、一致的用户体验。此外,文章还将提供一些实用的技巧和最佳实践,帮助开发者优化跨平台应用的性能和兼容性。
20 4
|
6天前
|
安全 Android开发 iOS开发
深入探讨Android与iOS操作系统的差异性
本文旨在通过对比分析Android和iOS两大主流移动操作系统,揭示它们在设计理念、用户体验、安全性、应用生态及系统更新等方面的根本差异。不同于传统的功能列表式摘要,本摘要强调了两大系统背后的哲学思想及其对用户日常使用的实际影响,为读者提供了一个宏观且深入的视角来理解这两种操作系统的独特之处。
|
5天前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异和挑战
【10月更文挑战第37天】在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统扮演着主角。它们各自拥有独特的特性、优势以及面临的开发挑战。本文将深入探讨这两个平台在开发过程中的主要差异,从编程语言到用户界面设计,再到市场分布的不同影响,旨在为开发者提供一个全面的视角,帮助他们更好地理解并应对在不同平台上进行应用开发时可能遇到的难题和机遇。
|
5天前
|
存储 安全 数据安全/隐私保护
深入探索Android与iOS的隐私保护机制:一场没有硝烟的较量####
本文深度剖析了Android与iOS两大移动操作系统在用户隐私保护方面的策略与实践,揭示两者在设计理念、技术实现及用户体验上的异同。通过对比分析,旨在为读者提供一个全面而深入的视角,理解两大平台如何在保障用户隐私的同时,实现功能的丰富与便捷。本文不涉及具体产品推荐或品牌偏好,仅从技术角度出发,探讨隐私保护的现状与挑战。 ####
|
5天前
|
前端开发 Android开发 iOS开发
探索Android与iOS的跨平台开发策略
在移动应用开发的多元化时代,跨平台开发已成为开发者追求效率和广泛覆盖的重要手段。本文深入探讨了Android与iOS两大主流平台下的跨平台开发策略,分析了各自的优势与挑战,并通过实际案例展示了如何有效实施跨平台解决方案,以期为开发者提供有价值的参考和启示。
|
4天前
|
安全 Android开发 iOS开发
深入探讨Android与iOS的系统架构差异
本文旨在通过对比分析Android和iOS两大移动操作系统的系统架构,揭示它们在设计理念、安全性、应用生态及开发环境等方面的显著差异。我们将从底层架构出发,逐步剖析至用户界面层面,为开发者和科技爱好者提供一份详尽的技术参考。
16 1
|
10天前
|
移动开发 Java Android开发
探索Android与iOS开发的差异性与互联性
【10月更文挑战第32天】在移动开发的大潮中,Android和iOS两大平台各领风骚。本文将深入浅出地探讨这两个平台的开发差异,并通过实际代码示例,展示如何在各自平台上实现相似的功能。我们将从开发环境、编程语言、用户界面设计、性能优化等多个角度进行对比分析,旨在为开发者提供跨平台开发的实用指南。
32 0