## 前言
本文針對的讀者是有經驗的C/C++程序員,希望了解Lua或者迅速抓住Lua的關鍵概念和模式進行開發的。因此本文并不打算教給讀者條件語句的語法或者函數定義的方式等等顯而易見的東西,以及一些諸如變量、函數等編程語言的基本概念。本文只打算告訴讀者Lua那些與C/C++顯著不同的東西以及它們實際上帶來了怎樣不同于C/C++的思考方式。不要小看它們,它們即將顛覆你傳統的C/C++的世界觀!
本文一共分[初階](http://blog.csdn.net/rexuefengye/article/details/13289777)、[進階](http://blog.csdn.net/rexuefengye/article/details/13290603)和[高階](http://blog.csdn.net/rexuefengye/article/details/13293099)三大部分,每個部分又有若干章節。讀者應當從頭至尾循序漸進的閱讀,但是標有“*”號的章節(主要討論OO在Lua中的實現方式)可以略去而不影響對后面內容的理解。讀者只要把前兩部分完成就可以勝任Lua開發的絕大部分任務。高階部分可作為選擇。
## 初階話題
### 1.八種基本類型: 如下表?
<table border="1" cellspacing="0" cellpadding="0"><tbody><tr><td valign="top" style="background:#99CCFF"><p align="center">基本類型</p></td><td valign="top" style="background:#99CCFF"><p align="center">描述</p></td><td valign="top" style="background:#99CCFF"><p align="center">備注</p></td></tr><tr><td valign="top"><p align="center">數值(number)</p></td><td valign="top"><p>內部以double表示</p></td><td valign="top"><p>?</p></td></tr><tr><td valign="top"><p align="center">字符串(string)</p><p align="center">?</p></td><td valign="top"><p>總是以零結尾,但可以包含任意字符(包括零),因此并不等價于C字符串, 而是其超集</p></td><td valign="top"><p>?</p></td></tr><tr><td valign="top"><p align="center">布爾(boolean)</p></td><td valign="top"><p>只有“true”或者“false”兩個值。</p></td><td valign="top"><p>?</p></td></tr><tr><td valign="top"><p align="center">函數(function)</p><p align="center">?</p></td><td valign="top"><p>Lua的關鍵概念之一。不簡單等同于C的函數或函數指針。</p></td><td valign="top"><p>?</p></td></tr><tr><td valign="top"><p align="center">表(table)</p></td><td valign="top"><p>異構的Hash表。Lua的關鍵概念之一。</p></td><td valign="top"><p>?</p></td></tr><tr><td valign="top"><p align="center">userdata</p><p align="center">?</p></td><td valign="top"><p>用戶(非腳本用戶)定義的C數據結構。腳本用戶只能使用它,不能定義。</p></td><td valign="top"><p>?</p></td></tr><tr><td valign="top"><p align="center">線程(thread)</p><p align="center">?</p></td><td valign="top"><p>Lua協作線程(coroutine),與一般操作系統的搶占式線程不一樣。</p></td><td valign="top"><p>?</p></td></tr><tr><td valign="top"><p align="center">nil</p><p align="center">?</p></td><td valign="top"><p>代表什么也沒有,可以與C的NULL作類比,但它不是空指針。</p></td><td valign="top"><p>?</p></td></tr></tbody></table>
### ?2.函數
2.1 實例代碼
~~~
function foo(a,b,c,...)
local sum = a+b
return sum,c --函數可以返回多個值
end
r1,r2 = foo(1,"123","hello")--平行賦值
print(r1,r2);
~~~
輸出結果:
124 hello?
2.2 函數基本使用方法
- 函數定義:
用關鍵字function定義函數,以關鍵字end結束
- 局部變量:
用關鍵字local定義。如果沒有用local定義,即使在函數內部定義的變量也是全局變量!
- 函數可以返回多個值:
return a, b, c, ...
- 平行賦值:
a, b = c, d
- 全局變量:
前面的代碼定義了三個全局變量:foo、r1和r2?
### 3.表
3.1 實現代碼
~~~
local a = {}
local b = {x = 1,["hello,"] = "world!"}
a["astring"] = "ni,hao!"
a[1] = 100
a["a table"] = b
for k,v in pairs(a) do
print(k,"=>",v);
end
~~~
輸出結果:
**1=>100**
**astring=>ni,hao!**
**a table=>table: 0xfd59570**
3.2 表使用方法
- 定義表(Table)的方式
a = {}, b = {...}
- 訪問表的成員
通過“.”或者“[]”運算符來訪問表的成員。
注意:表達式a.b等價于a[“b”],但不等價于a[b]
- 表項的鍵和值
任何類型的變量,除了nil,都可以做為表項的鍵。從簡單的數值、字符串到復雜的函數、表等等都可以;同樣,任何類型的變量,除了nil,都可以作為表項的值。給一個表項的值賦nil意味著從表中刪除這一項,比如令a.b= nil,則把表a中鍵為“b”的項刪除。如果訪問一個不存在的表項,其值也是nil,比如有c = a.b,但表a中沒有鍵為“b”的項,則c等于nil。?
### 4.一種簡單的對象實現方式?
4.1 實現代碼
~~~
function create(name,id)
local obj = {name = name,id = id}
function obj:SetName(name)
self.name = name
end
function obj:GetName()
return self.name
end
function obj:SetId(id)
self.id = id
end
function obj:GetId()
return self.id
end
return obj
end
local myCreate = create("sam",001)
for k,v in pairs(myCreate) do
print(k,"=>",v)
end
print("myCreate's name:",myCreate:GetName(),"myCreate's id:",myCreate.GetId(myCreate))
myCreate:SetId(100)
myCreate:SetName("Hello Kity")
print("myCreate's name:",myCreate:GetName(),"myCreate's id:",myCreate:GetId())
~~~
**SetName=>function: 0x85efc50**
**GetId=>function: 0x85efc10**
**id=>1**
**SetId=>function: 0x85efd00**
**GetName=>function: 0x85efce0**
**name=>sam**
**myCreate's name:sammyCreate's id:1**
**myCreate's name:Hello KitymyCreate's id:100**
4.2對象實現描述
- 對象工廠模式
如前面代碼的create函數
- 用表來表示對象
把對象的數據和方法都放在一張表內,雖然沒有隱藏私有成員,但對于簡單腳本來說完全可以接受。
- 成員方法的定義
function obj:method(a1, a2, ...) ... end?等價于function obj.method(self, a1, a2, ...) ... end 等價于obj.method = function (self, a1, a2, ...) ... end
- 成員方法的調用
obj:method(a1, a2, ...) 等價于obj.method(obj, a1, a2, ...)?
### 5.簡單繼承
5.1 ?實現代碼
~~~
local function CreateRobot(name,id)
local obj = {name = name,id = id}
function obj:SetName(name)
self.name = name
end
function obj:GetName()
return self.name
end
function obj:SetId(id)
self.id = id
end
function obj:GetId()
return self.id
end
return obj
end
local function createFootballRobot(name ,id ,position)
local obj = CreateRobot(name ,id)
obj.position = "right back"
function obj:SetPosition(p)
self.position = p
end
function obj:GetPosition()
return self.position
end
return obj
end
local mycreateFootballRobot = createFootballRobot("Tom",1000,"廣州")
print("mycreateFootballRobot's name:",mycreateFootballRobot:GetName(),"myCreate's id:",mycreateFootballRobot:GetId(),mycreateFootballRobot:GetPosition())
mycreateFootballRobot:SetName("麥迪")
mycreateFootballRobot:SetId(2000)
mycreateFootballRobot:SetPosition("北京")
print("mycreateFootballRobot's name:",mycreateFootballRobot:GetName(),"myCreate's id:",mycreateFootballRobot:GetId(),mycreateFootballRobot:GetPosition())
~~~
輸出結果:
mycreateFootballRobot's name:TommyCreate's id:1000right back
mycreateFootballRobot's name:麥迪myCreate's id:2000北京
5.2 簡單繼承優缺點
優點: ?簡單、直觀
缺點: ?傳統、不夠動態?
參考文獻《C/C++程序員的Lua快速入門》
- 前言
- lua學習筆記之一(C/C++程序員的Lua快速入門[初階話題])
- lua學習筆記之二(C/C++程序員的Lua快速入門[進階話題])
- lua學習筆記之三(C/C++程序員的Lua快速入門[高階話題])
- lua學習筆記之四(Lua中的基本函數庫)
- lua學習筆記之五(Lua中的數學庫)
- Lua中的table函數庫
- Lua中的常用操作系統庫
- LUA string庫
- LUA IO庫
- VS2010編譯Lua程序(lua-5.2.3)
- Lua中調用C函數(lua-5.2.3)
- Lua 常用數據結構
- lua 如何輸出樹狀結構的table?
- Lua中的元表與元方法
- lua 函數回調技巧
- Cocos2d-x使用Luajit實現加密
- Lua中的模塊與module函數
- 我所理解lua 語言中的點、冒號與self
- Lua代碼編寫規范