Lua 筆記

jopen 10年前發布 | 24K 次閱讀 Lua 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目錄下有兩個可執行文件了吧 分別是 lualuac

./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
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!