闭包的概念、形式与应用
元素呢?解决这些问题都要对数组进行遍历,如果是在不支持闭包的语言中,我们不得不一次又一次重复地写循环语句.而这在支持闭包的语言中是不必要的,比如对数组求和的操作在 Ruby 中可以这样做:
nums = [10,3,22,34,17]
抽象 闭包是数据和行为的组合,这闭包具有较好抽象能力,下面的代码通过闭包来模拟面向对象编程.函数 make_stack 用来生成 stack 对象,它的返回值是一个闭包,这个闭包作为一个 Dispatcher,当以 “push” 或 “pop” 为参数调用时,返回一个与函数 push 或 pop 相关联的闭包,进而可以操作 data 中的数据.
function make_stack() local data = {}; local function push(e) local function pop() return function (index)
s = make_stack() s("push")("test0") print(s("pop")())
简化代码 我们来考虑一个常见的问题.在一个窗口上有一个按钮控件,当点击按钮时会产生事件,如果我们选择在按钮中处理这个事件,那就在按钮控件中保存处理这个事件时需要的各个对象的引用.另一种选择是把这个事件转发给父窗口,由父窗口来处理这个事件,或是使用监听者模式.无论哪种方式,编写代码都不太方便,甚至要借助一些工具来帮助生成事件处理的代码框架.用闭包来处理这个问题则比较方便,可以在生成按钮控件的同时就写下事件处理代码.比如在 Ruby 中可以这样写:
song = Song.new 闭包的应用远不止这些,这里列举的只能算是冰山一角而已,并且更多的用法还不断发现中.要想了解更多的用法,多看一些代码应该是个不错的选择. 总结 闭包能优雅地解决很多问题,很多主流语言也顺应潮流,已经或将要引入闭包支持.相信闭包会成为更多人爱不释手的工具.闭包起源于函数语言,也许掌握一门函数语言是理解闭包的最佳途径,通过学习函数语言可以了解不同的编程思想,有益于写出更好的程序.
|
|||
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |