-- 會員 / 註冊 --  
 帳號:
 密碼:
  | 註冊 | 忘記密碼
3/26 新書到! 3/19 新書到! 3/14 新書到! 12/12 新書到!
購書流程Q & A站務留言版客服信箱
3ds MaxMayaRhinoAfter EffectsSketchUpZBrushPainterUnity
PhotoShopAutoCadMasterCamSolidWorksCreoUGRevitNuke
C#CC++Java遊戲程式Linux嵌入式PLCFPGAMatlab
駭客資料庫搜索引擎影像處理FluentVR+ARANSYS深度學習
單晶片AVROpenGLArduinoRaspberry Pi電路設計CadenceProtel
HadoopPythonStm32CortexLabview手機程式AndroidiPhone
可查書名,作者,ISBN,3dwoo書號
詳細書籍分類

Lua程序設計(第4版)

( 簡體 字)
作者:梅隆魁類別:1. -> 遊戲 -> 遊戲程式
譯者:
出版社:電子工業出版社Lua程序設計(第4版) 3dWoo書號: 49351
詢問書籍請說出此書號!

缺書
NT售價: 445

出版日:7/1/2018
頁數:432
光碟數:0
站長推薦:
印刷:黑白印刷語系: ( 簡體 版 )
加入購物車 加到我的最愛
(請先登入會員)
ISBN:9787121338045
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證)
作者序:

譯者序:

前言:

推薦序一
Lua 這種類似于“膠水”的語言在游戲行業被廣泛應用。我已經在游戲行業摸爬滾打了 很多年,對游戲行業的變化之快深有體會:游戲策劃時常更改設計是行業特點,工程師必須 把“不要寫死,要能熱更”這句話刻在心里。因此在做開發時,大家喜歡把邏輯放在 Lua 這 種嵌入型語言中,一方面是因為 Lua 性能好,另一方面主流引擎都支持通過推送 Lua 腳本來 實現熱更新,這樣在修改 Bug 或者更新內容時,用戶就不需要重新下載整個游戲安裝包。并 且 Lua 上手難度不高,所以很多初入游戲行業的程序員往往先學 Lua。但是,Lua 的中文學 習資料很有限,社區上的知識比較零碎,為數不多的英文書翻譯本也質量平平或其中所講的 版本已經過時,增加了初學者系統學習 Lua 的難度。所以,現在我們手中的這本用心打磨的 譯本,無疑是初學者的福音。 翻譯一本有用的但不蹭熱點的書,就像我們開發一款源自內心的喜愛卻不跟風的游戲, 也許不會成為爆款,但是總會對得起自己,也總能收獲一群用戶的喜愛。這本《Lua 程序設 計(第 4 版)》,體現了譯者的“傻勁”——不追捧熱點、專注自己想做的事情。這種“傻勁” 是這個時代稀缺的。然而讀者也好,游戲用戶也好,往往就喜歡這種“傻人”和他們的“傻 勁”,我真心希望這樣的“傻人”“傻勁”能多一些。 譯者還計劃要做一個 Lua 的社區,歡迎大家關注,也歡迎推薦給身邊的朋友,獨樂樂不 如眾樂樂。最后,開卷有益,祝大家學習愉快。
焦洋 蓋婭互娛 CTO

推薦序二
這幾年來,由于閱讀 Lua 虛擬機實現源碼的緣故,我深入了解了 Lua 的很多內部實現原 理。Lua 作為一門誕生已經超過 20 年的語言,在設計上是非常克制的,以 Lua 5.1.4 版本來 說,這個版本是 Lua 發展了十幾年之后穩定使用了很長時間的版本,其解釋器加上周邊的庫 函數等不過就是一萬多行的代碼。 在設計上,Lua 語言從一開始就把簡單、高效、可移植、可嵌入、可擴展等作為自己的 目標。打一個可能不是太恰當的比方,Lua 語言專注于做一個配角,作為膠水語言來輔助像 C、C++ 這樣的主角來更好地完成工作,當其他語言在前面攻城拔寨時,Lua 語言在后方實 現自己輔助的作用。現在大部分主流編程語言都在走大而全的路線,在號稱學會某一門語言 就能成為所謂的“全棧工程師”的年代,Lua 語言始終恪守本分地做好“膠水語言”的本職 工作,不得不說是一個異類的存在。 “上善若水,水善利萬物而不爭”,這大概是我能想到的最適合用于來描述 Lua 語言設計 哲學的句子。 然而,我發現想找到一本關于 Lua 語言本身設計相關的書籍卻很難。打開任何一個電商 網站,以關鍵字“Lua”來進行搜索,能找到的相關書籍大多是如何基于 Lua 做應用開發,如 游戲、OpenResty 等。在 2008 年,國內曾引進并翻譯了《Lua 程序設計(第 2 版)》。然而, 這一本書已經絕版不再印刷,而且 Lua 在這些年里也發生了不少的變化,從當時的 5.1 版本 到了現在的 5.3 版本,也在更多領域有了廣泛的應用。此時,引進并且翻譯最新版本的《Lua 程序設計(第 4 版)》就顯得很有必要了。 推薦那些常年要與 Lua 打交道的應用開發者都讀一下這本由 Lua 創作者親自編寫的 《Lua 程序設計(第 4 版)》,系統了解一下這門精致的語言,這不但對于深入理解并且使用 好 Lua 有幫助,同時其設計哲學和思想也能在某種程度上開闊我們的視野。
Codedump 《Lua 設計與實現》作者

譯者序
2016 年 2 月,時年 27 歲的我因春節期間暴飲暴食導致急性胰腺炎入院治療兩個余月。 當真正別無選擇地終日躺在病床上時,就似乎不可避免地開始面對和嘗試回答那個亙古不變 的問題:“假設有一天我死了,究竟能夠留下什么?” Lua 語言從 1993 年誕生至今已 20 余年,是開源嵌入式腳本語言領域中一門獨樹一幟 的語言,在包括嵌入式、物聯網、游戲、游戲外掛、軟件安全、逆向工程等領域中均具有 不可替代的重要地位和極為廣泛的應用。截至 2017 年 7 月,Lua 語言在 IEEE Spectrum 編 程語言排行榜中名列第 21 位。近年來,除了游戲領域典型的應 用外,包括 Redis、Nginx/OpenResty、NMAP、WOW、OpenWRT、PhotoShop 等大量的著名 產品也均使用 Lua 作為其嵌入式腳本引擎,以供開發者進行功能擴展和二次開發等。伴隨著 移動互聯網、DevOps 等的迅猛發展,Lua 語言在包括熱更新、不停機部署等的實現方面也提 供了一種現實的解決方案(例如銀行等金融應用中某些采用 C 語言編寫的性能密集型核心 交易邏輯)。在 Lua 語言多年的發展過程中,也有大量的第三方機構對 Lua 語言進行了多方 面的改進和增強,諸如 Lua JIT 等的發展也十分迅速。 除了語言本身的使用外,從語言的實現、原理、設計哲學等角度看,Lua 語言也是學習 編譯原理、虛擬機、腳本引擎等的重要參考和現實依據,可以成為相關領域教科書式的典范, 在國外也一直是部分高校計算機專業開展相關課程時的重要學習對象之一。在游戲領域,深 入學習 Lua 語言后進行消化、吸收、優化、重構、增強甚至基于 Lua 語言的思想重新開發一 種腳本語言或一個腳本引擎的例子屢見不鮮;在軟件安全領域,基于虛擬機的思想設計出的 各類混淆、VM 保護產品更是有無數的先例;在各種灰色產業中,Lua 語言也同樣扮演了更 加鮮為人知的重要角色。 我在研究生期間學習嵌入式和游戲逆向領域的過程中涉獵了 Lua 語言,之后由于在工作 中需要編寫 Nginx 和 Redis 的 Lua 腳本(Redis 的 Lua 腳本在原子性、執行效率等方面具有 顯著優勢)才開始對 Lua 語言進行深入的學習。然而,在學習 Lua 語言的過程中,我發現國內對 Lua 語言的應用仍主要集中在傳統的游戲領域,市面上有限的幾本在售書籍也主要針對 Lua 語言在游戲開發中的使用,并沒有一本書從語言本身的維度進行系統性介紹。目前網絡 上的各類中文資料、教程、手冊也大多是碎片化的,而且面向的還主要是 Lua 語言的陳舊版 本。對于有一定專業素養的從業人員而言,通常可以通過文檔或速成式的教程在數天或數周 內基本掌握一門語言,對于非計算機專業的開發人員或一般使用者則會難些。但我認為即便 只考慮專業從業者,也需要一本權威、系統且工具性的書籍對 Lua 語言進行全面的介紹,以 幫助實現低成本地快速學習和快速上手。此外,從事游戲逆向等軟件安全領域的人士也有快 速建立對 Lua 語言認知甚至進行深入學習的必要。 2006 年左右,本書的英文第 2 版出版后,國內出版了其中文譯本,但至今已經超過 10 年,且本書的英文第 3 版也已經對全書的內容進行了重大重構,最新的 Lua 5.3 也發生了較 大的變化,因此之前的中文第 2 版和網絡上流傳的影印版 PDF 均已經不能滿足讀者現有的 需求。在這樣的情況下,加上機緣的巧合,我于 2016 年 11 月開始與電子工業出版社博文視 點的符隆美編輯一起聯系了遠在巴西的 Lua 語言的作者,并最終從國內諸多出版商和譯者中 殺出重圍,艱難地爭取到了作者的翻譯版授權。 目前 Lua 語言在國內的發展不像 Python 語言、R 語言等為人熟知,也不似 Go 語言等站 在風口浪尖,但 Lua 語言在國外卻一直保持著持續性的演進,在過去 20 年間表現出了極為 強大的生命力(隨便舉一個嵌入式領域 OpenWrt 路由器操作系統的例子,目前在各大主流 路由器品牌或 KOS/小博無線等商業 WIFI 服務商中均扮演著不可替代的重要作用)。我相信, 盡管略顯小眾,譯文中也難免有值得商榷之處,這樣一本針對 Lua 語言最新版本的權威、系 統性的中文譯本都應該能夠為游戲、嵌入式、物聯網、逆向工程、軟件安全、移動互聯網、 C 語言核心系統開發工程師等諸多領域的學生、愛好者和從業人員提供些許幫助——而這也 是我作為一名計算機行業從業人員的愿望。 在開始本書的翻譯工作前,我自詡具有尚可的文字感知和表達能力,在多年的學習和工 作中也閱讀過計算機行業多個不同領域的大量中英文文檔,力圖以“信、達、雅”的原則要 求自己,從一名計算機行業一線從業者的角度,在盡可能正確地理解了原著英文意思后,用 盡可能專業的語言進行表述,避免出現讀者“感覺還不如直接去看英本原版”的情況。但是, 2017 年 4 月 20 日我拿到本書的部分原稿并開始著手翻譯后,我發現在“信、達、雅”三者間 做好平衡著實不是一件易事。受精力和能力所限,我也并未在實際生產代碼中使用過原著中 講解的所有機制,所以譯文中也一定會有諸多不妥、失誤甚至錯誤,如果讀者有任何意見或 建議可以直接通過我的郵箱(mlkui@163.com)或 QQ 讀者交流群(QQ 群號:662640785) 聯系我,我會虛心接受一切批評和指正。
最后,我要感謝我的父母、妻子及親人們多年來給予的無限關心、支持和陪伴,你們是 我今天幸福生活的締造者和組成者,也是我奮斗的根本動力和首要原因。 感謝中國民生銀行、中國民生銀行總行信息科技部的領導和同事們,盡管他們中的一些 已經離開。中國民生銀行是我走上社會后的第一個工作單位,感謝他們自我 2012 年入行實 習以來在工作和生活上給予的無限支持、認可、包容和指點。 感謝中學、本科及研究生的朋友、同學、老師和團隊,感謝他們多年以來給予的陪伴、 認可和信任,也祝愿我們在未來有機會攜手共創輝煌。 感謝電子工業出版社及其計算機圖書分社博文視點,感謝博文視點符隆美編輯的認可和 信任,感謝他們在本書引進并最終出版發行全過程中的卓越眼光和艱辛努力。 這是我自己真正署名的第一本技術書籍,盡管翻譯本書帶來的經濟收入(我會把本書微 薄的版稅收入全部用于 Lua 語言中文官方網站的日常服務器 及帶寬開支,并捐獻給其他投入國內 Lua 語言推廣的相關組織和活動)與我投入的精力完全 不成正比,與我耗費相同時間從事其他工作所能帶來的直接利益無法相提并論,但是,我想, 我終于可以給這個世界留下點什么了。 真誠希望我的勞動能夠幫助更多有需要的人,幫助他們創造更多的價值!
梅隆魁 2017 年 7 月于北京
前言
1993 年,當我和 Waldemar、Luiz 開發 Lua 語言時,我們并沒有想象到它會像今天這樣 被如此廣泛地使用。當年,Lua 語言只是為了兩個特定項目而開發的實驗室項目;如今,Lua 語言被大量應用于需要一門簡明、可擴展、可移植且高效的腳本語言的領域中,例如嵌入式 系統、移動設備、物聯網,當然還有游戲。 Lua 語言從一開始就被設計為能與 C/C++ 及其他常用語言開發的軟件集成在一起使用 的語言,這種設計帶來了非常多的好處。一方面,Lua 語言不需要在性能、與三方軟件交互 等 C 語言已經非常完善的方面重復“造輪子”,可以直接依賴 C 語言實現上述特性,因而 Lua 語言非常精簡;另一方面,通過引入安全的運行時環境、自動內存管理、良好的字符串 處理能力和可變長的多種數據類型,Lua 語言彌補了 C 語言在非面向硬件的高級抽象能力、 動態數據結構、魯棒性、調試能力等方面的不足。 Lua 語言強大的原因之一就在于它的標準庫,這不是偶然,畢竟擴展性本身就是 Lua 語 言的主要能力之一。Lua 語言中的許多特性為擴展性的實現提供了支持:動態類型使得一定 程度的多態成為了可能,自動內存管理簡化了接口的實現(無須關心內存的分配/釋放及處 理溢出),作為第一類值的函數支持高度的泛化,從而使得函數更加通用。 Lua 語言除了是一門可擴展的語言外,還是一門膠水語言(glue language)。Lua 語言支 持組件化的軟件開發方式,通過整合已有的高級組件構建新的應用。這些組件通常是通過 C/C++ 等編譯型強類型語言編寫的,Lua 語言充當了整合和連接這些組件的角色。通常,組 件(或對象)是對程序開發過程中相對穩定邏輯的具體底層(如小部件和數據結構)的抽 象,這些邏輯占用了程序運行時的大部分 CPU 時間,而產品生命周期中可能經常發生變化 的邏輯則可以使用 Lua 語言來實現。當然,除了整合組件外,Lua 語言也可以用來適配和改 造組件,甚至創建全新的組件。 誠然,Lua 語言并非這個世界上唯一的腳本語言,還有許多其他的腳本語言提供了類似 的能力。盡管如此,Lua 語言的很多特性使它成為解決許多問題的首選,這些特性如下。 可擴展: Lua 語言具有卓越的可擴展性。Lua 的可擴展性好到很多人認為 Lua 超越了編 程語言的范疇,其甚至可以成為一種用于構建領域專用語言(Domain-Specific Language,DSL)的工具包。Lua 從一開始就被設計為可擴展的,既支持使用 Lua 語言代碼來擴展, 也支持使用外部的 C 語言代碼來擴展。在這一點上有一個很好的例證:Lua 語言的大部 分基礎功能都是通過外部庫實現的。我們可以很容易地將 Lua 與 C/C++、Java、C# 和 Python 等結合在一起使用。 簡明: Lua 語言是一門精簡的語言。盡管它本身具有的概念并不多,但每個概念都很 強大。這樣的特性使得 Lua 語言的學習成本很低,也有助于減小其本身的大小(其包含 所有標準庫的 Linux 64 位版本僅有 220 KB)。 高效: Lua 語言的實現極為高效。獨立的性能測試說明 Lua 語言是腳本語言中最快的 語言之一。 可移植: Lua 語言可以運行在我們聽說過的幾乎所有平臺之上,包括所有的類 UNIX 操作系統(Linux、FreeBSD 等)、Windows、Android、iOS、OS X、IBM 大型機、游戲 終端(PlayStation、Xbox、Wii 等)、微處理器(如 Arduino)等。針對所有這些平臺的 源碼本質上是一樣的,Lua 語言遵循 ANSI(ISO)C 標準,并未使用條件編譯來對不同 平臺進行代碼的適配。因此,當需要適配新平臺時,只要使用對應平臺下的 ISO C 編譯 器重新編譯 Lua 語言的源碼就可以了。
預期讀者
除了本書的最后一部分(其中討論了 Lua 語言的 C 語言 API)外,閱讀本書并不需要對 Lua 語言或其他任何一種編程語言有預先了解。不過,閱讀本書的確需要了解一些基本的編 程概念,尤其是變量與賦值、控制結構、函數與參數、流與文件及數據結構等。 Lua 語言有三類典型用戶:在應用程序中嵌入式地使用 Lua 語言的用戶、單獨使用 Lua 語言的用戶,以及和 C 語言一起使用 Lua 語言的用戶。 諸如 Adobe Lightroom、Nmap 和魔獸世界等在內的許多應用程序中嵌入式地使用了 Lua 語言。這些應用使用 Lua 語言的 C 語言 API 去注冊新函數、創建新類型和改變部分運算符 的行為,以最終達到將 Lua 語言用于特定領域的目的。一般情況下,這些應用的用戶根本感 受不到 Lua 語言其實是一門被用于特定領域的獨立編程語言。例如,Lightroom 插件的很多 開發者壓根兒不知道他們使用的是 Lua 語言,Nmap 的用戶也傾向于將 Lua 語言視為 Nmap 腳本引擎所使用的語言,魔獸世界的很多玩家也認為 Lua 語言是這個游戲所獨有的。盡管應用場景各異,Lua 語言的核心是相同的,本書中將要講的編程技巧也都是適用的。除了用于文本處理和用后即棄的小程序外,作為一門獨立的編程語言,Lua 語言也同樣 適用于大中型項目。對于這些應用而言,Lua 語言的主要能力源于標準庫。例如,標準庫提 供了模式匹配和其他字符串處理函數。隨著 Lua 語言不斷改進對標準庫的支持,第三方庫的 數量在不斷增加。LuaRocks 是一個 Lua 語言模塊的部署和管理系統,該系統在 2015 年管理了 1000 多個涵蓋各個領域的模塊。 最后,還有一部分程序員會在編寫程序時將 Lua 語言當作 C 語言的一個標準庫來使用。 他們通常更多地用 C 語言(相對于 Lua 語言)來進行編碼,但是只有較好地理解了 Lua 語 言才能寫出簡單易用且便于二者集成的接口。
全書結構
本書的這一版本增加了針對很多領域的新內容和示例,包括沙盒、協程以及日期和時間 處理。此外,還增加了 Lua 5.3 的相關內容,包括整型值、位運算及無符號整型值等。 更具體地說,這一版對全書結構進行了重大的重構。在本版中,筆者嘗試圍繞編程中的 常見主題來組織內容,而不是圍繞編程語言(例如分章節介紹每個標準庫)去組織內容。新 的組織方式來自于 Lua 語言教學的實際經驗,它能幫助讀者從簡單的主題開始循序漸進地學 習。特別地,筆者認為這一版的組織方式讓本書成為了 Lua 語言相關課程的一份更好的教學 資源。 和前幾版一樣,本書共由 4 個部分組成,每個部分包括 9 章左右的內容,各有側重。 第1部分涵蓋了 Lua 語言的基礎知識(因此這一部分被命名為語言基礎),主要圍繞數 值、字符串、表和函數等幾種主要數據類型,也對基本輸入/輸出模型和 Lua 語言的整體語 法進行了介紹。 第2部分為編程實操,涵蓋了在其他類似編程語言中也經常涉及的高級主題,如閉包、模 式匹配、時間和日期處理、數據結構、模塊和錯誤處理等。 第3部分為語言特性。顧名思義,這一部分介紹了 Lua 語言與其他語言相比的不同之處, 如元表及其使用、環境、弱引用表、協程和反射等高級特性。 最后,和以前的版本一樣,本書的第4部分介紹了 Lua 語言和 C 語言之間的 API,以便 于使用 C 語言的開發者能夠發揮出 Lua 語言的全部能力。由于在這一部分中將使用 C 語言 而非 Lua 語言進行編程,所以這一部分和本書的其他部分大相徑庭。一些讀者可能對 Lua 語 言的 C 語言 API 毫無興趣,而其他一些讀者可能覺得這一部分是本書中最有意義的部分。在本書的所有部分中,我們都專注于不同的語言結構,并且使用了大量的示例和練習來 演示如何將這些語言結構應用于實際需求中。在一些章節之間,我們也設置了幾個“插曲”, 每個“插曲”都提供了一個簡短但完整的 Lua 語言程序,以幫助讀者建立對 Lua 語言的更多 整體認識。
其他資源
官方文檔是所有真正希望學習一門語言的人所必須具備的資料。本書無意取代 Lua 語言 官方文檔。相反,本書是對官方文檔的補充。一方面,官方文檔只描述了 Lua 語言,其中既 沒有代碼實例,也沒有語言結構的基本原理。另一方面,官方文檔覆蓋了 Lua 語言的所有內 容,本書則跳過了 Lua 語言中的一些極少使用的邊邊角角。此外,官方文檔是有關 Lua 語言 最權威的文檔,本書中任何與官方文檔不同的地方都應該以官方文檔為準。我們可以在 Lua 語言的官方網站上找到官方文檔和其他的更多內容。 此外,在 Lua 語言的用戶社區中也有不少有用的信息。與其他 資源相比,用戶社區提供了教程、第三方庫列表、文檔以及 Lua 語言官方郵件列表的存檔等 資料。 本書內容基于 Lua 5.3 版本,不過書中的大部分內容對于老版本和可能的后續版本同樣 適用。Lua 5.3 和 Lua 5.x 老版本之間的區別都已經被清晰地描述了出來;如果讀者使用的是 本書出版后更新的版本,那么也可以在官方文檔中找到相應版本之間的具體差異。
運行示例
運行本書中的示例需要使用 Lua 語言解釋器。盡管理想情況下應該使用 Lua 5.3 版本, 但本書中的大部分示例無須修改也能在舊版本中運行。可以從 Lua 語言的官網上下載解釋器的源碼。如果讀者知道如 何使用 C 語言編譯器在自己的機器上編譯 C 代碼,那么建議嘗試從源碼編譯并安裝 Lua 語 言(這非常簡單)。Lua Binaries 網站(搜索 luabinaries)為大多數主流平臺提供了已經編 譯好的 Lua 語言解釋器。如果讀者使用的是 Linux 或者其他的類 UNIX 操作系統,那么通常 在軟件庫中已經提供了 Lua 語言執行環境,很多個發行版中已經提供了 Lua 語言相關的包。 Lua 語言有幾種集成開發環境(IDE),在搜索引擎中搜一下就可以找到(盡管如此,筆 者還是推薦 Windows 下的命令行接口或者其他操作系統下的文本編輯器,尤其是對于初學者而言)。
致謝
從本書第 1 版發行到現在已經十余年了。在這十余年中,很多朋友和機構都給予過很多 幫助。 像過去一樣,Luiz Henrique de Figueiredo、Waldemar Celes 和 Lua coauthors 給予了很多幫 助。Reuben Thomas、Robert Day、Andre Carregal、Asko Kauppi、Brett Kapilik、Diego Nehab、 Edwin Moragas、Fernando Jefferson、Gavin Wraith、John D. Ramsdell 和 Norman Ramsey 提出 了無數的建議,也為豐富本書第 4 版的內容提供了很多啟發。Luiza Novaes 為本書的封面設 計提供了關鍵性的支持。 感謝 Lightning Source 公司在本書印刷和發行過程中表現出的可靠和高效。如果沒有他 們的幫助,自己出版本書幾乎是不可能的。 感謝 Marcelo Gattass 領導的 Tecgraf,他們從 1993 年 Lua 項目誕生到 2005 年期間一直 為 Lua 語言提供資助,并且仍在以很多方式持續地推動 Lua 語言的發展。 我還要感謝里約熱內盧天主教大學(Pontifical Catholic University of Rio de Janeiro,PUCRio)和巴西國家研究理事會(Brazilian National Research Council,CNPq),感謝他們對我工 作的一貫支持。如果沒有 PUC-Rio 為我提供的環境,那么 Lua 語言項目的開發根本不可能 進行。 最后,我必須向 Noemi Rodriguez 表達我最誠摯的感謝(包括技術方面和非技術方面), 感謝她點亮了我的生活。
內容簡介:

本書由 Lua 語言作者親自撰寫,針對 Lua 語言本身由淺入深地從各個方面進行了完整和細致的講解。作為第 4 版,本書主要針對的是 Lua 5.3,這是本書撰寫時 Lua 語言的最新版本。作者從語言使用者的角度出發,講解了語言基礎、編程實操、高級特性及 C 語言 API 等四個方面的內容,既有 Lua 語言基本數據類型、輸入輸出、控制結構等基礎知識,也有對模塊、閉包、元表、協程、延續、反射、環境、垃圾回收、函數式編程、面向對象編程、C 語言 API 等高級特性的系統講解,還有對 Lua 5.3 中引入的整型、位運算、瞬表、延續等新功能的細致說明。

目錄:

第 1 部分 語言基礎 1
1 Lua 語言入門 2
1.1 程序段 . . . . . 3
1.2 一些詞法規范 . . . . . 5
1.3 全局變量 . . . . . . 7
1.4 類型和值 . . . . . . 7
1.4.1 nil . . . . . . 8
1.4.2 Boolean . . . . . 8
1.5 獨立解釋器 . . . . . 10
1.6 練習 . . . . . 12
2 小插曲:八皇后問題 13
2.1 練習 . . . . . 15
3 數值 17
3.1 數值常量 . . . . . . 17
3.2 算術運算 . . . . . . 19
3.3 關系運算 . . . . . . 21
3.4 數學庫 . . . . . 21
3.4.1 隨機數發生器 . . . . . 22
3.4.2 取整函數 . . . . 22
3.5 表示范圍 . . . . . . 24
3.6 慣例 . . . . . 25
3.7 運算符優先級 . . . . . 26
3.8 兼容性 . . . . . 27
3.9 練習 . . . . . 28
4 字符串 30
4.1 字符串常量 . . . . . 31
4.2 長字符串/多行字符串 . . . . . 33
4.3 強制類型轉換 . . . . . 34
4.4 字符串標準庫 . . . . . 36
4.5 Unicode 編碼 . . . . . . 39
4.6 練習 . . . . . 41
5 表 43
5.1 表索引 . . . . . 44
5.2 表構造器 . . . . . . 46
5.3 數組、列表和序列 . . . . . 48
5.4 遍歷表 . . . . . 50
5.5 安全訪問 . . . . . . 52
5.6 表標準庫 . . . . . . 53
5.7 練習 . . . . . 54
6 函數 56
6.1 多返回值 . . . . . . 58
6.2 可變長參數函數 . . . . 61
6.3 函數 table.unpack . . . . 64
6.4 正確的尾調用 . . . . . 65
6.5 練習 . . . . . 66 7 輸入輸出 68
7.1 簡單 I/O 模型 . . . . . . 68
7.2 完整 I/O 模型 . . . . . . 72
7.3 其他文件操作 . . . . . 74
7.4 其他系統調用 . . . . . 75
7.4.1 運行系統命令 . . . . . 75
7.5 練習 . . . . . 77
8 補充知識 78
8.1 局部變量和代碼塊 . . . . . 78
8.2 控制結構 . . . . . . 80
8.2.1 if then else . . . . . 81
8.2.2 while . . . . . . 81
8.2.3 repeat . . . . . . 82
8.2.4 數值型 for . . . . . 82
8.2.5 泛型 for . . . . 83
8.3 break、return 和 goto . . . . . 84
8.4 練習 . . . . . 88
第 2 部分 編程實操 90
9 閉包 91
9.1 函數是第一類值 . . . . 92
9.2 非全局函數 . . . . . 94
9.3 詞法定界 . . . . . . 96
9.4 小試函數式編程 . . . . 100
9.5 練習 . . . . . 103 10 模式匹配 105
10.1 模式匹配的相關函數 . . . . . 105
10.1.1 函數 string.find . . . . . 105
10.1.2 函數 string.match . . . . 106
10.1.3 函數 string.gsub . . . . . 107
10.1.4 函數 string.gmatch . . . . 107
10.2 模式 . . . . . 108
10.3 捕獲 . . . . . 112
10.4 替換 . . . . . 114
10.4.1 URL 編碼 . . . . 116
10.4.2 制表符展開 . . . . . 118
10.5 訣竅 . . . . . 119
10.6 練習 . . . . . 123
11 小插曲:出現頻率最高的單詞 124
11.1 練習 . . . . . 126
12 日期和時間 128
12.1 函數 os.time . . . . . . 129
12.2 函數 os.date . . . . . . 130
12.3 日期和時間處理 . . . . 132
12.4 練習 . . . . . 134
13 位和字節 135
13.1 位運算 . . . . . 135
13.2 無符號整型數 . . . . . 136
13.3 打包和解包二進制數據 . . . . 139
13.4 二進制文件 . . . . . 142
13.5 練習 . . . . . 144 14 數據結構 145
14.1 數組 . . . . . 146
14.2 矩陣及多維數組 . . . . 146
14.3 鏈表 . . . . . 149
14.4 隊列及雙端隊列 . . . . 150
14.5 反向表 . . . . . 151
14.6 集合與包 . . . . . . 152
14.7 字符串緩沖區 . . . . . 154
14.8 圖形 . . . . . 156
14.9 練習 . . . . . 158
15 數據文件和序列化 159
15.1 數據文件 . . . . . . 160
15.2 序列化 . . . . . 162
15.2.1 保存不帶循環的表 . . . . . 165
15.2.2 保存帶有循環的表 . . . . . 167
15.3 練習 . . . . . 169
16 編譯、執行和錯誤 171
16.1 編譯 . . . . . 171
16.2 預編譯的代碼 . . . . . 175
16.3 錯誤 . . . . . 177
16.4 錯誤處理和異常 . . . . 179
16.5 錯誤信息和棧回溯 . . . . . 180
16.6 練習 . . . . . 182
17 模塊和包 184
17.1 函數 require . . . . . . 185
17.1.1 模塊重命名 . . . . . 187 17.1.2 搜索路徑 . . . . 188
17.1.3 搜索器 . . . . . 190
17.2 Lua 語言中編寫模塊的基本方法 . . . 190
17.3 子模塊和包 . . . . . 193
17.4 練習 . . . . . 194
第 3 部分 語言特性 196
18 迭代器和泛型 for 197
18.1 迭代器和閉包 . . . . . 197
18.2 泛型 for 的語法 . . . . 200
18.3 無狀態迭代器 . . . . . 201
18.4 按順序遍歷表 . . . . . 203
18.5 迭代器的真實含義 . . . . . 205
18.6 練習 . . . . . 206
19 小插曲:馬爾可夫鏈算法 208
19.1 練習 . . . . . 211
20 元表和元方法 212
20.1 算術運算相關的元方法 . . . . 213
20.2 關系運算相關的元方法 . . . . 216
20.3 庫定義相關的元方法 . . . . . 217
20.4 表相關的元方法 . . . . 219
20.4.1 __index 元方法 . . . . 219
20.4.2 __newindex 元方法 . . . . 220
20.4.3 具有默認值的表 . . . . 221
20.4.4 跟蹤對表的訪問 . . . . 222
20.4.5 只讀的表 . . . . 224
20.5 練習 . . . . . 225 21 面向對象(Object-Oriented)編程 226
21.1 類(Class) . . . . . 228
21.2 繼承(Inheritance) . . . . 230
21.3 多重繼承(Multiple Inheritance) . . . . 232
21.4 私有性(Privacy) . . . . . 235
21.5 單方法對象(Single-method Object) . . . . 237
21.6 對偶表示(Dual Representation) . . . 238
21.7 練習 . . . . . 240
22 環境(Environment) 241
22.1 具有動態名稱的全局變量 . . . . . 242
22.2 全局變量的聲明 . . . . 243
22.3 非全局環境 . . . . . 246
22.4 使用 _ENV . . . . . . 248
22.5 環境和模塊 . . . . . 251
22.6 _ENV 和 load . . . . . . 252
22.7 練習 . . . . . 254
23 垃圾收集 255
23.1 弱引用表 . . . . . . 255
23.2 記憶函數(Memorize Function) . . . 257
23.3 對象屬性(Object Attribute) . . . . . 259
23.4 回顧具有默認值的表 . . . . . 260
23.5 瞬表(Ephemeron Table) . . . . . 261
23.6 析構器(Finalizer) . . . . 262
23.7 垃圾收集器 . . . . . 266
23.8 控制垃圾收集的步長(Pace) . . . . 267
23.9 練習 . . . . . 268 24 協程(Coroutine) 270
24.1 協程基礎 . . . . . . 270
24.2 哪個協程占據主循環 . . . . . 273
24.3 將協程用作迭代器 . . . . . 276
24.4 事件驅動式編程 . . . . 279
24.5 練習 . . . . . 284
25 反射(Reflection) 285
25.1 自省機制(Introspective Facility) . . . . 286
25.1.1 訪問局部變量 . . . . . 288
25.1.2 訪問非局部變量 . . . . 289
25.1.3 訪問其他協程 . . . . . 291
25.2 鉤子(Hook) . . . . . 292
25.3 調優(Profile) . . . . . 293
25.4 沙盒(Sandbox) . . . . . 296
25.5 練習 . . . . . 300
26 小插曲:使用協程實現多線程 301
26.1 練習 . . . . . 306
第 4 部分 C 語言 API 307
27 C 語言 API 總覽 308
27.1 第一個示例 . . . . . 309
27.2 棧 . . . . . . 312
27.2.1 壓入元素 . . . . 313
27.2.2 查詢元素 . . . . 314
27.2.3 其他棧操作 . . . . . 317
27.3 使用 C API 進行錯誤處理 . . . . . 320 27.3.1 處理應用代碼中的錯誤 . . . . 320
27.3.2 處理庫代碼中的錯誤 . . . . . 321
27.4 內存分配 . . . . . . 322
27.5 練習 . . . . . 324
28 擴展應用 325
28.1 基礎知識 . . . . . . 325
28.2 操作表 . . . . . 327
28.2.1 一些簡便方法 . . . . . 331
28.3 調用 Lua 函數 . . . . . 333
28.4 一個通用的調用函數 . . . . . 334
28.5 練習 . . . . . 338
29 在 Lua 中調用 C 語言 339
29.1 C 函數 . . . . . . 339
29.2 延續(Continuation) . . . . . 342
29.3 C 模塊 . . . . . . 345
29.4 練習 . . . . . 347
30 編寫 C 函數的技巧 349
30.1 數組操作 . . . . . . 349
30.2 字符串操作 . . . . . 351
30.3 在 C 函數中保存狀態 . . . . . 355
30.3.1 注冊表 . . . . . 355
30.3.2 上值 . . . . . 358
30.3.3 共享的上值(Shared upvalue) . . . . 361
30.4 練習 . . . . . 362 31 C 語言中的用戶自定義類型 363
31.1 用戶數據(Userdata) . . . . . 364
31.2 元表(Metatable) . . . . . 367
31.3 面向對象訪問 . . . . . 370
31.4 數組訪問 . . . . . . 372
31.5 輕量級用戶數據 . . . . 373
31.6 練習 . . . . . 375
32 管理資源 376
32.1 目錄迭代器 . . . . . 376
32.2 XML 解析器 . . . . . . 380
32.3 練習 . . . . . 390
33 線程和狀態 392
33.1 多線程 . . . . . 392
33.2 Lua 狀態 . . . . . . 397
33.3 練習 . . . . . 406
序: