Lua 筆記
Lua 筆記
下載
官網下載:
lua官網地址 下載源碼。
解壓安裝:
tar zxvf lua-5.2.1.tar.gz
然后修改下Makefile
文件, 修改其中的安裝地址:
# 安裝的地址,以下的bin ,include lib 等都基于這個 INATALL_TOP=/usr/local/lua
然后進行 make
但是會發現有提示錯誤,提示沒加平臺的參數,這時根據提示的平臺名稱加在 make之后就可以了
make linux make install
執行腳本
這樣就安裝好了,開始第一個hello world 吧
cd /usr/local/lua/bin ./lua print 'hello world'
看見輸出結果了吧。其實有三種方法來執行lua腳本。
第一種就是 上面的例子,在終端里的lua bin目錄里輸入./lua,進入控制臺來執行lua 語句。
進入控制臺的標志是前面有個>
第二種 是執行單獨的腳本文件,后綴名是.lua
touch my.lua -- lua 的注釋就是兩個- print 'hello world'
然后也是在bin目錄里 執行這個文件
./lua my.lua
也看到結果了吧
第三種方法 lua 是支持編譯的,當你不想讓別人看到你的程序的源碼的話 ,你可以編譯先,然后再執行。應該注意到bin目錄下有兩個可執行文件了吧 分別是 lua
和 luac
./luac my.lua
這樣就編譯好了,會在當前目錄創建一個luac.out
文件,這個就是編譯文件了
./lua luac.out
這樣就可以了。
但是這個luac.out是默認的文件名,所以如果多個編譯文件產生會覆蓋之前的一個 ,-h 后發現有個參數-o 可以自定義編譯文件的名稱
語法結構是 /usr/local/lua/bin/luac [options] [filenames]
所以
./luac -o my.myout my.lua
這樣就OK了
開發工具
這里補充一下我用的開發工具:sublime text 3 很不錯,具體配置如下:
菜單》TOOLS>Build System> 如果沒有lua 則選擇New Build System..
然后就彈出一個配置文件,修改如下:
{ "cmd": ["/usr/local/bin/lua", "$file"], "file_regex": "^(...*?):([0-9]*):?([0-9]*)", "selector": "source.lua" }
cmd 后面的數組第一個參數就是你的lua執行程序的路徑,其他不變就OK
配置完,還是 菜單》TOOLS>Build System>lua 就好了
這樣就可以來執行結果了 方法是 cmd+b
然后設置vim 模式:
Preferences=>Settings User=> 然后復制粘貼下面代碼,保存,然后按esc
就可以進入vim 模式了。
{ "ignored_packages": [] }
LUA的注釋方法
lua的注釋很特別,是用兩個-
組成的--
:
--this is a description
多行注釋是 --[[...]]
,起于--
,止于]]
, 是可以多層嵌套的,并且在5.1版本以上,可以在兩個中括號加若干個=
,但必須收尾數量一致,例如:
--[[ this is a description ]] and... --[==[ one one [===[ two two ]===] [[three]] ]==]
隨意寫拉。。
LUA的簡單語法
定義全局變量
variable = 100
局部變量
local variable = 'aaa'
定義函數
function aaa() .... end -- 調用 aaa()
函數傳參
function max(a,b) if a>b then return a else return b end end
for 循環
for 起始值,終止值[,步長] do .... end for i=1,100,2 do print(1) end
表
config = {} --定義一個空表 或者給表初始值,多個之間用逗號分割 config = {name='user1',sex='man'} 給表的屬性賦值有兩種方式: config.age = 30 config["age"] = 30
遍歷表
for key,value in pairs(config) do print(key,value) end
數組
定義方法和表類似
arr = {} --定義一個空數組 arr = {1,2,3,4,5,6,7} arr = {1,2,3,['key']='hello',4,5}
注意lua的數組是下標從1開始的,并且當計算其長度的時候,返回的長度只是 下標為連續默認下標的數量
local arr = {[6]='hello',[7]='hello',[8]='hello',[9]='hello',[10]='hello',[11]='hello',1,4} print(#arr) --返回的是2
具體如何返回正確長度,還在研究,歡迎指點
LUA 面向對象方式編程
之所以說面向對象方式編程,是因為lua本身并不支持對象類型。在lua里一切都是變量。就和javascript里一切都是對象一樣。
但是我們可以通過一些編程技巧把lua寫成類似面向對象的方式,讓“看起來”是面向對象的。
實例化
有兩種方式,第一種就是表復制的方法:
People = {} --先定義一個空表,當作“類“ --然后定義一個類方法: People.sayHi = function() print('hello') end --也可以這么寫: --[[ function People.syaHi() print('hello') end ]] --新建一個方法用來復制表,可以看做“實例化“ function clone(tab) --定義一個空表用來復制表 local ins = {} for k,v in pairs(tab) do ins[k] = v end end --調用的時候 local person = clone(People) person.sayHi()
這樣就簡單的模擬了類的實例化和調用,但是如果初始化要傳參怎么辦呢?我們在來改進下:
People = {} People.sayHi = function(ins) print('hello '..ins.name) -- ..是字符串和變量的連接符 end function clone(tab) local ins = {} for k,v in pairs(tab) do ins[k] = v end end People.new = function(name) { local self = clone(People) self.name = name return self } local person = People.new('xiaoming') person.sayHi(person)
但是這種寫法也別扭有木有,lua有個方便的寫法,上面person.sayHi(pserson)
等價于:
person:sayHi()
繼承
lua的繼承的方式和實例化差不多
--首先我們寫一個供繼承的基類 People = {} --然后定義一個簡單的成員方法和,供“實例化”的方法 People.say = function(ins) print('hello'..ins.name) end People.new = function(name) --因為會有傳參 local ins = clone(People) ins.name = name return ins end function clone(tab) local ins = {} for k,v in pairs(tab) do ins[k] = v end return ins end --下面我們來聲明一個新的子類Man來繼承People Man = {} Man.new = function(name) local ins = {} --復制父類People ins = People.new(name) --我們再來定義一個方法,目的是把Man所有屬性附加到People里 copy(ins,Man) return ins end function copy(des, tab) for k,v in pairs(tab) do des[k] = v end end
我們來調用下父類的say方法看看效果
local p = Man.new('myname') p:say() --hello myname
我們來重寫下父類的say方法
Man.say = function(self) print('my name is:'..self.name) end
再來調用下:
p:say() --my name is:myname
好啦 以上就是用復制表的方法來偽實現類的實例和繼承
第二種方式:用函數閉包的方式來實現
--首先來寫一個函數,來當作類 function People(name) local ins = {} --初始化操作 local function init() ins.name = name end --定義成員方法 ins.say = function() print('hello:'..ins.name) end init() --返回前調用下初始化 return ins end
我們來調用下:
local p = People('zhang san') p:say() --hello: zhang san
這種寫法看到沒,是不是就比較像正常類的結構了?沒錯,這個結構明了不像復制表那樣雜亂,但是復制表的方式更快。不過,私有化的東西,比如例子中的init,復制表是做不到的
下面寫下繼承:
function Man(name) local ins = People(name) local function init() --木有初始化的東西 end --成員方法 ins.saygoodbye = function() print('goodbye:'.. ins.name) end --重寫方法 ins.say = function() print('hello again:'.. ins.name) end init() return ins end
調用
local m = Man('xiaoming') m:say() --hello again:xiaoming m:saygoodbye() --goodbye:xiaoming