网站的推广方案怎么写广科网站开发
news/
2025/10/8 9:43:46/
文章来源:
网站的推广方案怎么写,广科网站开发,Wordpress如何创建菜单,建筑工程app最近放假在写一个小项目#xff0c;用到了闭包和匿名函数的知识#xff0c;记录一下 What#xff1f;
匿名函数#xff1a;匿名函数#xff08;英语#xff1a;Anonymous Function#xff09;在计算机编程中是指一类无需定义标识符#xff08;函数名#xff09;的函数… 最近放假在写一个小项目用到了闭包和匿名函数的知识记录一下 What
匿名函数匿名函数英语Anonymous Function在计算机编程中是指一类无需定义标识符函数名的函数或子程序普遍存在于多种编程语言中。C从C11开始支持。 闭包闭包英语Closure又称词法闭包Lexical Closure或函数闭包function closures是在支持函数编程的编程语言中实现词法绑定的一种技术。闭包在实现上是一个结构体它存储了一个函数通常是其入口地址和一个关联的环境相当于一个符号查找表 匿名函数只是一个没有名字的函数闭包是一个函数指针配套环境闭包是一个函数的实例。 当匿名函数内也有外界定义的变量时就变成了闭包当闭包没有外界变量时可以优化成一个普通函数(不一定是匿名函数) why
闭包的存在是为了保护私有变量不被污染,形成不销毁的栈内存里面的私有变量等信息保存下来。 匿名函数常用于回调函数、事件处理器、或者在需要临时定义函数的地方。它们有助于减少代码的复杂性使代码更加简洁。
how
匿名函数是一种技术只有lambda表达式一种实现。 闭包是一种思想可以用不同方式来实现
方法一重载()操作符
C允许进行操作符重载可以将一个类的()操作符重载就可以使这个类的实例可以调用Eg
#include iostreamclass Operator {public:int operator ()(int a, int b) {return abbias;}private:int bias 1;
};int main() {Operator op;std::cout op(1, 2) std::endl;return 0;
}好奇能不能将这个重载声明为static试了一下发现报错说运算符不能是静态成员函数。 方法二lambda表达式
C11中引入了lambda表达式lambda是函数式编程中的概念用于定义匿名函数Eg
#include iostream
#include functionalint main() {int bias 1;std::functionint(int) f [bias](int x) { return x bias; };// lambda函数bias是捕获的变量x是参数// 如果不捕获变量可以写成[]如果捕获所有变量可以写成[]// 不捕获变量时就是一个普通的函数捕获后就变成了闭包std::cout f(1) std::endl;return 0;
}方法三参数绑定
C11在标准库中新增了bind函数std::bind是C中实现函数参数绑定的一种方式它允许你创建一个可调用的函数对象该对象可以存储一部分参数并在需要时再提供剩余的参数。这在某些情况下非常有用比如在多线程编程中你可能需要将参数和函数传递给不同的线程。 C11之前boost中有参数绑定函数bind可以调用boost::bind函数 使用bind定义闭包如下
#include iostream
#include functionalint add(int a, int b) {std::cout a: a b: b std::endl;return a b;
}int main()
{auto f std::bind(add, std::placeholders::_2, std::placeholders::_1);// placeholders可以理解为占位符_1表示第一个参数_2表示第二个参数以此类推// 上面的代码表示将add函数的第二个参数作为f的第一个参数第一个参数作为f的第二个参数// 所以调用f(1,2)时实际上调用的是add(2,1)std::cout f(1,2) std::endl;auto f2 std::bind(add, 1, std::placeholders::_1);// 上面的代码表示将add函数的第一个参数固定为1第一个参数作为f2的第二个参数std::cout f2(2) std::endl;auto f3 std::bind(add, std::placeholders::_1, 2);// 上面的代码表示将add函数的第二个参数固定为2第一个参数作为f3的第一个参数std::cout f3(1) std::endl;auto f4 std::bind(add, 1, std::placeholders::_2);// 上面的代码表示将add函数的第一个参数固定为1第二个参数作为f4的第二个参数// 所以调用时必须给两个参数std::cout f4(1,2) std::endl;return 0;
}使用时要注意C不会因为闭包而延长变量的生命周期在lambda中引用一个已经释放了的变量是一种未定义行为文档原话 If a non-reference entity is captured by reference, implicitly or explicitly, and operator() of the closure object is invoked after the entity’s lifetime has ended, undefined behavior occurs. The C closures do not extend the lifetimes of objects captured by reference. others
C语言 C语言中没有语法可以支持闭包但是C语言支持回调函数可以通过回调函数来达到类似于闭包的效果。 在C语言中支持回调函数的库有时在注册时需要两个参数一个函数指针一个独立的void*指针用以保存用户数据。这样的做法允许回调函数恢复其调用时的状态。这样的惯用法在功能上类似于闭包但语法上有所不同。Python Python从一开始就支持闭包在Python中经常用闭包来实现装饰器
import functools
import timedef logger(func):装饰器函数用于记录函数的调用信息functools.wraps(func) # 保持原始函数的名称和文档字符串def wrapper(*args, **kwargs):print(fCalling {func.__name__} at {time.ctime()})result func(*args, **kwargs)print(f{func.__name__} returned {result})return resultreturn wrapper# 使用装饰器
logger
def add(a, b):Add two numbers.return a b# 调用被装饰的函数
result add(3, 4)
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/931330.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!