歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux系統:閉包的概念形式與應用(4)

Linux系統:閉包的概念形式與應用(4)

日期:2017/2/25 10:36:13   编辑:Linux教程
s = make_stack()
s("push")("test0")
s("push")("test1")
s("push")("test2")
s("push")("test3")
print(s("pop")())
print(s("pop")())
print(s("pop")())

如果加入一些方便調用“對象方法”的語法糖,這看起來很像是面向對象的語法。當然 Lua 中有自己的面向對象語法和機制,所以幾乎看不到有人寫這樣的 Lua 代碼,但是對於 Scheme 等沒有內建面向對象支持也沒有內建復雜數據抽象機制的語言,使用閉包來進行抽象是非常重要的手段。
簡化代碼
我們來考慮一個常見的問題。在一個窗口上有一個按鈕控件,當點擊按鈕時會產生事件,如果我們選擇在按鈕中處理這個事件,那就必須在按鈕控件中保存處理這個事件時需要的各個對象的引用。另一種選擇是把這個事件轉發給父窗口,由父窗口來處理這個事件,或是使用監聽者模式。無論哪種方式,編寫代碼都不太方便,甚至要借助一些工具來幫助生成事件處理的代碼框架。用閉包來處理這個問題則比較方便,可以在生成按鈕控件的同時就寫下事件處理代碼。比如在 Ruby 中可以這樣寫:
清單 12. 簡化代碼
song = Song.new
start_button = MyButton.new("Start") { song.play }
stop_button = MyButton.new("Stop") { song.stop }
更多
閉包的應用遠不止這些,這裡列舉的只能算是冰山一角而已,並且更多的用法還不斷發現中。要想了解更多的用法,多看一些代碼應該是個不錯的選擇。
總結
閉包能優雅地解決很多問題,很多主流語言也順應潮流,已經或將要引入閉包支持。相信閉包會成為更多人愛不釋手的工具。閉包起源於函數語言,也許掌握一門函數語言是理解閉包的最佳途徑,而且通過學習函數語言可以了解不同的編程思想,有益於寫出更好的程序。
Copyright © Linux教程網 All Rights Reserved