標籤:

lua基礎學習(一)

這應該是個lua學習系列,很久以前就想把lua好好學學,從現在開始!

lua簡介

  • Lua 是一種輕量小巧的腳本語言,用標準C語言編寫並以源代碼形式開放,其設計目的是為了嵌入應用程序中,從而為應用程序提供靈活的擴展和定製功能。
  • Lua 是巴西里約熱內盧天主教大學(Pontifical Catholic University of Rio de Janeiro)里的一個研究小組,由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo所組成並於1993年開發。

lua特性

  • 輕量級: 它用標準C語言編寫並以源代碼形式開放,編譯後僅僅一百餘K,可以很方便的嵌入別的程序里。
  • 可擴展: Lua提供了非常易於使用的擴展介面和機制:由宿主語言(通常是C或C++)提供這些功能,Lua可以使用它們,就像是本來就內置的功能一樣。
  • 其它特性:
    • 支持面向過程(procedure-oriented)編程和函數式編程(functional programming);
    • 自動內存管理;只提供了一種通用類型的表(table),用它可以實現數組,哈希表,集合,對象;
    • 語言內置模式匹配;閉包(closure);函數也可以看做一個值;提供多線程(協同進程,並非操作系統所支持的線程)支持;
    • 通過閉包和table可以很方便地支持面向對象編程所需要的一些關鍵機制,比如數據抽象,虛函數,繼承和重載等。

lua的個人理解

  • lua是腳本語言,在CC++里使用的時候,要引入頭文件和lib,其實我覺得可以理解為宿主程序調用lua程序時,由lua的解釋器(lib等)來執行這段程序並返回給宿主程序,以前公司的一個牛逼的牛人用bcb寫過js的腳本解釋器,可惜只提供了lib庫出來,我們做二次開發時寫js文件,裡面可以調用他提供的內置函數,感覺跟lua原理很像。有機會應該要拜讀下lua源碼。

Lua closure

  • lua閉包,它具有著這種特性:將一個函數寫在另一個函數之內,那麼這個位於內部的函數便可以訪問外部函數中的局部變數,這項特性稱之為詞法域。
  • 示例

-- 實現部分 function create_a_counter() local count=0 return function() count = count + 1 return count end end -- 調用部分 local mycounter = create_a_counter(); print("counter = "..mycounter()) print("counter = "..mycounter()) print("counter = "..mycounter()) print("counter = "..mycounter()) print("counter = "..mycounter()) print("counter = "..mycounter()) mycounter = nil mycounter = create_a_counter(); print("counter = "..mycounter()) print("counter = "..mycounter()) print("counter = "..mycounter()) print("counter = "..mycounter()) print("counter = "..mycounter()) print("counter = "..mycounter())

引用AlbertS的簡書並增加了展示內容地址jianshu.com/p/10e0cf2d8

  • 結果

總結

  • create_a_counter返回的是一個函數,傳給了變數mycounter,可以這麼理解,可以用無數個變數接收create_a_counter返回的函數,每個變數擁有自己的內存區域,所以每個變數的count是獨立的,當變數賦值為nil時,內存回收。
  • 我們可以利用這項特性實現很多功能,比如計數器、繼承等。
  • 高級應用後續有機會補上。

可供參考的網址

  • AlbertS的簡書 jianshu.com/u/8fad76e7e

轉載請署名,請勿非法轉載。

推薦閱讀:

【遊戲安全】看我如何通過hook攻擊LuaJIT
GopherLua基礎入門
學習哪些 Functional programming language 能夠拓寬眼界,學到和其他編程範式明顯不一樣的東西?
HammerSpoon - 不止是窗口管理
Unity3D遊戲優化之Lua的內存

TAG:Lua |