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