Lua學習基礎--02

1.ipairs和pairs的區別

ipairs以數組形式遍歷
pairs以鍵值對形式遍歷

2.table.sort

第一個參數爲表,第二個參數爲自定義排序規則。cmp要寫在上sort之上。

local aray={1,2,3,4,5,6,7}
function cmp(a,b)
	return a>b
end
table.sort(array)

輸出結果爲:7 6 5 4 3 2 1

3.table.concat

第一個參數爲表,第二個參數爲鏈接字符,第三個參數爲鏈接的初始索引,第四個參數爲鏈接的結束索引。最後返回一個鏈接後的字符串

local array={7,6,5,4,3,2,1}
res = table.concat(array,',',1,5);
print(res)

輸出結果爲:‘7,6,5,4,3,2,1’

4.基礎運算符
算數運算符(雙目):+()   -(/負號)   *()   /()   %(求模)   ^(乘冪)
關係運算符(雙目): >(大於)  <(小於)  >=(大於等於)   <=(小於等於)   ==(等於)   ~=(不等於)
邏輯運算符(雙目):and(如果a爲false則返回a。否則返回b)    or(如果a爲true則返回a,否則返回b)    not(於邏輯運算結果相反,如果運算結果爲true則返回false)
邏輯運算舉例:
and:
local a=true
local b=true
print(a and b)--結果爲:b
local a=false
local b=true 
print(a and b)--結果爲:a

or:
local a=true
local b=true
print(a and b)結果爲a
local a=false
local b=true
print(a and b)--結果爲結果爲b
5.lua元表的查詢機制

衆所周知,Lua的表本質其實是個類似Dictionary的東西,其元素是很多的Key-Value鍵值對。如果嘗試訪問了一個表中並不存在的元素時,就會觸發Lua的一套查找機制,Lua也是憑藉這個機制來模擬了類似“類”的行爲。下面是一段簡單地訪問表中元素的代碼:

myTable = {
    prop1 = 'Property',
}
print (myTable.prop1)
print (myTable.prop2)  --打印不存在的成員prop2

稍微有些Lua語法的同學,一看就可以看出,上面的輸出結果爲:Property nil 。輸出爲nil的原因很簡單,myTable中並沒有prop2這個成員,這符合我們平時操作Dictionary的習慣。但對於Lua的表,如果myTable有元表和元方法,情況就不同了。下面我們再看一下設置了元表和元方法的代碼:

father = {  
    prop1=1  
}  
son = {  
    prop2=1  
}  
setmetatable(son, father) --把son的metatable設置爲father  
print (son.prop1) 

執行輸出的結果仍然爲:nil,這正印證了上面所說的,只設置元表是不管用的。再來看看同時設置元表和對應的元方法的代碼:

father = {  
    prop1=1  
}  
father.__index = father -- 把father的__index方法指向它本身
son = {  
    prop2=1  
}  
setmetatable(son, father) --把son的metatable設置爲father  
print (son.prop1)

執行輸出的結果爲:1。

結合上述的幾個小例子,我們再來解釋一下__index元方法的含義:在上面的例子中,當訪問son.prop1時,son中是沒有prop1這個成員的。接着Lua解釋器發現son設置了元表:father,(需要注意的是:此時Lua並不是直接在fahter中找到名爲prop1的成員,而是先調用father的__index方法),如果__index方法爲nil,則直接返回nil。如果__index指向了一張表(上面的例子中father的__index指向了自己本身),那麼就會到__index方法所指向的這個表中去查找名爲prop1的成員。最終,我們在father表中找到了prop1成員。這裏的__index方法除了可以是一個表,也可以是一個函數,如果是函數的話,__index方法被調用時會返回該函數的返回值。

Lua查找一個表元素的規則可以歸納爲如下幾個步驟:

  • Step1:在表自身中查找,如果找到了就返回該元素,如果沒找到則執行Step2;
  • Step2:判斷該表是否有元表(操作指南),如果沒有元表,則直接返回nil,如果有元表則繼續執行
  • Step3:判斷元表是否設置了有關索引失敗的指南(__index元方法),如果沒有(__index爲nil),則直接返回nil;如果有__index方法是一張表,則重複執行Step1->Step2->Step3;如果__index方法是一個函數,則返回該函數的返回值
6.lua實現面向對象(一)

首先實現一個類,創建Window.lua實現windos類:

local Window={width=10,height=20}
function Window:new(w,h)
	local instance={}
	setmetatable(instance,{__index=self})
	instance.width=w
	instance.height=h
	return instance
end

function Window:OpenWindow()
	print("Open The Window",self.width,self.height)
end
return Window

再創建Test.lua,調用Window來進行操作

local win=require("Window")
local window=win:new(100,200)
window:OpenWindow()

輸出結果爲:“Open The Window” 100 200

7.lua實現面向對象(二)

這裏主要實現一下lua的繼承。
再創建一個BlueWindow.lua,作爲Window的派生類。

local Window=require("Window")

BlueWindow={color="blue"}
setmetatable(BlueWindow,Window)
function BlueWindow:new(w,h,c)
	local instance={}
	instance=Window:new(w,h)
	setmetatable(instance,{__index=self})
	instance.color=c
	return instance
end

function BlueWindow:OpenWindow()
	print("OpenWindow",self.width,self.height,self.color)
end

return BlueWindow

然後這時候在Test.lua中我們來使用派生類吧

--[[local win=require("Window")
local w=win:new(10,20)
w:OpenWindow()]]

local window=require("BlueWindow")
local win=window:new(100,200,"Red")
win:OpenWindow()

輸出結果爲:“Open The Window” 100 200 Red

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