函数指针、闭包和 Lambda

2023-12-01

我现在刚刚学习函数指针,当我阅读有关该主题的 K&R 章节时,我首先想到的是,“嘿,这有点像闭包。”我知道这个假设在某种程度上从根本上是错误的,在网上搜索后我没有找到任何对此比较的分析。

那么为什么 C 风格的函数指针与闭包或 lambda 有根本的不同呢?据我所知,这与函数指针仍然指向已定义(命名)的函数这一事实有关,而不是匿名定义函数的做法。

为什么在第二种情况下将函数传递给函数(它是未命名的)比第一种情况(它只是传递一个普通的日常函数)更强大?

请告诉我如此密切地比较两者是如何以及为什么是错误的。


一个 lambda(或closure) 封装了函数指针和变量。这就是为什么在 C# 中,您可以执行以下操作:

int lessThan = 100;
Func<int, bool> lessThanTest = delegate(int i) {
   return i < lessThan;
};

我在那里使用了一个匿名委托作为闭包(它的语法比 lambda 等价物更清晰、更接近 C),它将 lessThan(堆栈变量)捕获到闭包中。当闭包被评估时,lessThan(其堆栈帧可能已被破坏)将继续被引用。如果我更改 lessThan,那么我会更改比较:

int lessThan = 100;
Func<int, bool> lessThanTest = delegate(int i) {
   return i < lessThan;
};

lessThanTest(99); // returns true
lessThan = 10;
lessThanTest(99); // returns false

在 C 语言中,这是非法的:

BOOL (*lessThanTest)(int);
int lessThan = 100;

lessThanTest = &LessThan;

BOOL LessThan(int i) {
   return i < lessThan; // compile error - lessThan is not in scope
}

虽然我可以定义一个带有 2 个参数的函数指针:

int lessThan = 100;
BOOL (*lessThanTest)(int, int);

lessThanTest = &LessThan;
lessThanTest(99, lessThan); // returns true
lessThan = 10;
lessThanTest(100, lessThan); // returns false

BOOL LessThan(int i, int lessThan) {
   return i < lessThan;
}

但是,现在我在评估它时必须传递两个参数。如果我希望将此函数指针传递给 lessThan 不在范围内的另一个函数,我要么必须通过将其传递给链中的每个函数来手动保持其活动状态,要么将其提升为全局函数。

尽管大多数支持闭包的主流语言都使用匿名函数,但对此没有任何要求。你可以有没有匿名函数的闭包,也可以有没有闭包的匿名函数。

总结:闭包是函数指针+捕获变量的组合。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

函数指针、闭包和 Lambda 的相关文章

随机推荐

  • Python 3.5 ImportError:动态模块未定义模块导出函数(PyInit_cv2)

    这就是我尝试将 cv2 导入 python3 5 IDLE 时得到的结果 我正在使用 OpenCV 3 1 0 Python3 5 2 Ubuntu 16 04 我尝试了很多安装方法 但没有人解决我的问题 我在终端上进行了导入 但它也停止了
  • 我想捕获所有没有特定标签的标签

    我想捕获我可以使用的所有名为 STRONG 的标签
  • 在响铃期间更改响铃音量

    我想在响铃时更改响铃音量 下面的代码在响铃期间设置它 在系统设置中更改 但它不会在实际响铃时生效 只有下一个响铃呼叫才会使用新值 我可以强制此更改使其立即生效吗 AudioManager audio AudioManager context
  • 在 Java 中通过一次调用(如 JSON.stringify)打印整个结构?

    如何在Java中打印任何类实例 类似于 Javascript 中的 JSON stringify 不需要 JSON 任何格式的输出都可以 public class User public String name password publi
  • PHP旋转和合并时的图像质量问题

    当我合并两个图像作为一个背景 另一个作为目标图像时 我正在使用 png 当我旋转目标图像然后合并时 是的 一切都很好 除了旋转图像的边缘变得锯齿形 我的意思是不平滑 如何使用php GD使边缘平滑 我正在使用的代码
  • 如何公开嵌套在 UserControl 中的控件的 DependencyProperty?

    我正在尝试将图像从窗口绑定到用户控件 显示处理程序 内的用户控件 显示 中 显示有一个 DependencyProperty DisplayImage 这类似于this 但他们的回答对我的问题没有帮助 DisplayHandler 还应该具
  • AppFabric 客户端虚拟机问题

    我们有 AppFabric 缓存集群服务器 我可以使用我的开发计算机作为客户端来使用它 为了模拟不同的Web服务器访问缓存集群服务器 我创建了VMWare虚拟机并安装了Visual Studio 2010和我的Web应用程序 从虚拟机作为客
  • 我可以从 Tomcat 上下文设置 JDBC 隔离级别吗?

    我有一个在 Tomcat 6 中运行的 Web 应用程序 并且我已设法将其配置为使用内置 DBCP 连接池 并且一切都运行良好 但我怀疑它在数据库上的错误隔离级别中运行 我希望它以未提交读的方式运行 但我认为它以已提交读的方式运行 并且不知
  • GtkWindow 一次只能包含一个小部件

    我正在使用此代码来检索并显示来自网络的图像 class Display object def init self self window gtk Window gtk WINDOW TOPLEVEL self window connect
  • 当mapoverlay可见时隐藏mapview ios7

    当 iOS7 中的地图视图顶部有覆盖层时 如何隐藏地图视图 这段代码曾经在 iOS6 中工作 但是当我将我的应用程序升级到 iOS7 时 它停止工作 NSArray views self mapView subviews objectAtI
  • 带有页脚的 Recyclerview 无法删除最后一项

    我在用带页脚的回收视图一切正常 但我无法删除最后一项 假设我们现在列表中有 2 个产品 如果用户删除一个产品 那么 1 个产品将保留在列表中recyclerview那么我无法删除剩余的产品 虽然我有一件商品 但它显示 PACK ID nul
  • C#.Net 中使用 IP 地址和端口号的 TCP/IP 客户端套接字程序

    TCP IP 客户端套接字程序 这里我的主要要求是客户端发送消息 服务器接收消息并存储在 C Net 的数据库表中 使用服务器 IP 地址和端口号 您正在谈论一个简单的服务器 客户端程序 你需要做什么 首先创建一个服务器程序并运行 创建客户
  • 检索文件的全名,按日期过滤

    date datetime 05 19 2014 gci Recurse Select Object FullName LastWriteTime Where Object LastWriteTime ToShortDateString g
  • mod_security:允许没有请求正文的 POST 请求的规则

    我安装了 Apache 2 4 和 mod security 2 9 1 它正在工作 有一些非常基本的规则 我正在尝试发出一个包含一些标头信息的 POST 请求 但请求正文中没有任何内容 该请求是发送给受 mod security 保护的
  • subscribe 的作用是什么?它与 Observable 有何关系?

    我是 Angular 的新手 我遵循的教程有术语 Observable 导师解释了 但我没有完全理解 什么是Observable 以及为什么我们总是要打电话observable subscribe 什么是subscribe 实际上呢 什么是
  • 使用 .NET“异步”API 防止 TIME_WAIT

    我有一个问题 我开发了一个客户端和服务器包装器供我个人使用 但不幸的是由于网络编程知识不足 我在客户端连接期间遇到了 TIME WAIT 问题 我的客户端现在尝试在短时间内与同一主机建立多个连接 我发现其主要原因是因为我试图重用套接字 并且
  • NASM 引导加载程序中的 jmp $

    我试图编写引导加载程序引导装载程序 写的代码是 BITS 16 start mov ax 07C0h Set up 4K stack space after this bootloader add ax 288 4096 512 16 by
  • 在 ASP.NET 应用程序中实现多语言的最佳方式

    多语言应用程序中预计会发生以下事情 行为 为登录用户的语言选择正确的资源 字符串排序应根据用户语言进行 例如 对于瑞典用户 瑞典字母应按顺序排在 z 之后 日期时间格式验证应根据用户的语言进行 例如 fr FR 用户可以输入 dd mm y
  • 有没有办法将数组传递给 python 泛型?

    我正在做一些元编程 我需要一种方法来动态定义类型提示 有没有办法将参数数组传递给类型提示 就像是 Some programatically generated list where I don t know the content unti
  • 函数指针、闭包和 Lambda

    我现在刚刚学习函数指针 当我阅读有关该主题的 K R 章节时 我首先想到的是 嘿 这有点像闭包 我知道这个假设在某种程度上从根本上是错误的 在网上搜索后我没有找到任何对此比较的分析 那么为什么 C 风格的函数指针与闭包或 lambda 有根