Lua入門系列----pil學習筆記之Type and Values (2)

本文作者:sodme
本文出處:http://blog.csdn.net/sodme
聲明: 本文可以不經作者同意, 任意複製, 轉載, 但任何對本文的引用都請保留文章開始前三行的作者, 出處以及聲明信息. 謝謝.

參考資源:
http://www.lua.org/pil/

7. 如果有人問我,  c裏, 你覺得哪種基本數據類型最爽?  我會說, 那可能是union吧, 因爲它可以讓我一定程度的偷懶. 而如果有人問我,  lua裏你覺得哪種基本數據類型最爽?我會肯定的回答: table.
lua的官方文檔裏是這樣"吹噓"table的:
We use tables to represent ordinary arrays, symbol tables, sets, records, queues, and other data structures, in a simple, uniform, and efficient way.

table, 你可以把它理解爲一個數組, 但是, 這個數組, 實在是太強大了, 強大到在第一次使用時, 你可以充分發揮自己的想象力可能都想象不出來的地步. 因爲我們的傳統觀念, 已經被c引導完了, 理論全都僵化了, lua的table, 我自己規納起來, 至少有以下幾點非常吸引人:
1. 它允許不同的類型的元素, 放在同一張表中, 只要你想放, 隨便你放什麼類型進來, 甚至是數據和函數都可以各放各的;
2. 表中可以套表
3. 正因爲1和2, 很多人把table當成了C++裏的類;
4. 其下標, 可以用數字, 也可以用字符串表示.  table對於數據元素的存儲, 有數組和hash 表兩種存儲方式. 用數字作爲下標時, 當最大下標值不超過;

但是, 拋開這些表面的風光來看, 看看lua自己說的: Tables in Lua are neither values nor variables; they are objects.其實,也就明白了,沒啥,人家把table當對象用了.而對象這個玩意,對於我們這些玩過c++ r人來說,功能有多強大 ,就看設計者如何設計了.

lua的表, 是匿名的, 它不會自動修正持有表引用地址的變量與表本身的關係.  對於變量的維護, 由編程者自己設定, 而對於表的維護, 則由lua完成. 什麼意思呢? 看下面的例子:
a={}
a["x"] = 10
b = a
a =nil
b =nil
在 上面這個例子中, b和a都指向的是同一個表, 但b和a本身其實只是個指針罷了.  當a=nil後, 只表示通過a無法再訪問到匿名的那個table, 而b=nil的時候, 也只表示通過b無法再訪問到那個匿名的table, 那麼, 那個匿名的table, 是什麼時候釋放的呢? 當我們執行 a = {}以及b=a這些賦值操作時, 匿名的table身上會加一個引用計數值, 當lua的內存管理器發現引用計數器爲0時, 則執行表的釋放操作.

表元素在未初始化時, 默認值爲nil. 同樣的, 也可以通過給表元素賦值爲nil來釋放掉這個元素. 注意表下標的引用方式, 要麼以數字或字符串常量的方式引用, 要麼以變量的方式引用, 但以變量方式引用時, 變量必須事前賦值. 注意: 10與 "10"作爲下標, 是存放在不同位置的. 前者存放在數組中, 後者存放在hash table中.

8. lua官方文檔的開頭, 是這樣描述function的: Functions are first-class values in Lua.  看這意思, 是把function奉爲上賓了. 具體地說, function聲明函數本身外, 還可以這樣用: 作爲變量值, 作爲參數值以及作爲返回值. first-class functions play a key role in Lua's object-oriented facilities. lua之所以可以實現面向對象, 也與function的功勞相關很大(廢話, 沒有對數據操作的函數, 能叫面向對象嗎?!) , 不過, 在這一節裏, 讀者可能最希望看到的還是這兩者如何實現:
lua裏如何調用c++或c, 以及
c/c++裏如何調用lua
這個問題很長, 後面會講.

9.userdata, 也是一個好東西, 它只是提供了一個將c層數據傳到lua層的手段, 而lua裏究竟能對userdata 幹些什麼, 還需要回調c的函數. 具體使用, 也後面再說.



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章