LUA基礎問題

2021-10-04 15:19:14 字數 4527 閱讀 7352

1、lua中八種基礎型別:nil(空),boolean(布林),number(數字),string(字串),userdata(自定義型別),function(函式),thread(執行緒),table(表)

2、string.sub(「123456」,2,-2) //結果2345

3、lua中 只有 false 和 nil 代表假

– print(false==nil) --false

– print((nil and false)) --nil //nil也是代表false,所以就不去算and後面了

– print(false or nil == true)–false

– print(nil and false ==true) --nil //and or 的優先順序最低

1、lua的特性

輕量級: 它用標準c語言編寫並以源**形式開放,編譯後僅僅一百餘k,可以很方便的嵌入別的程式裡。

可擴充套件: lua提供了非常易於使用的擴充套件介面和機制:由宿主語言(通常是c或c++)提供這些功能,lua可以使用它們,就像是本來就內建的功能一樣。

其它特性:

支援面向過程(procedure-oriented)程式設計和函式式程式設計(functional programming);

自動記憶體管理;只提供了一種通用型別的表(table),用它可以實現陣列,雜湊表,集合,物件;

語言內建模式匹配;閉包(closure);函式也可以看做乙個值;提供多執行緒(協同程序,並非作業系統所支援的執行緒)支援;

通過閉包和table可以很方便地支援物件導向程式設計所需要的一些關鍵機制,比如資料抽象,虛函式,繼承和過載等。

2、lua資料型別

lua是動態型別語言,變數不要型別定義,只需要為變數賦值。 值可以儲存在變數中,作為引數傳遞或結果返回。

lua中有8個基本型別分別為:nil、boolean、number、string、userdata、function、thread和table。

其中:lua 把 false 和 nil 看作是"假",其他的都為"真":

3、pairs 和 ipairs區別

pairs: 迭代 table,可以遍歷表中所有的 key 可以返回 nil

ipairs: 迭代陣列,不能返回 nil,如果遇到 nil 則退出

**示例:

local tab=  

for i,v in pairs(tab) do -- 輸出 "a" ,"b", "c" ,

print( tab[i] )

end

for i,v in ipairs(tab) do -- 輸出 "a" ,k=2時斷開

print( tab[i] )

end

4、lua元表(metatable)在 lua table 中我們可以訪問對應的key來得到value值,但是卻無法對兩個 table 進行操作。

因此 lua 提供了元表(metatable),允許我們改變table的行為,每個行為關聯了對應的元方法。

例如,使用元表我們可以定義lua如何計算兩個table的相加操作a+b。

當lua試圖對兩個表進行相加時,先檢查兩者之一是否有元表,之後檢查是否有乙個叫"__add"的字段,若找到,則呼叫對應的值。"__add"等即時字段,其對應的值(往往是乙個函式或是table)就是"元方法"。

有兩個很重要的函式來處理元表:

setmetatable(table,metatable): 對指定table設定元表(metatable),如果元表(metatable)中存在__metatable鍵值,setmetatable會失敗 。

getmetatable(table): 返回物件的元表(metatable)。

__index 元方法 __index用於查詢

這是 metatable 最常用的鍵。

local t = 

local mt =

setmetatable(t,mt);

print(t.money);

[lua-print] 雖然你呼叫了我不存在的字段,不過沒關係,我能探測出來:money

[lua-print] nil

當呼叫了不存在的money欄位時,就會呼叫table元表裡的__index元方法,並且會傳遞table和欄位名兩個引數。

於是,我們就可以在這個函式裡做很多自定義的操作了。

當你通過鍵來訪問 table 的時候,如果這個鍵沒有值,那麼lua就會尋找該table的metatable(假定有metatable)中的__index 鍵。如果__index包含乙個**,lua會在**中查詢相應的鍵。

lua查詢乙個表元素時的規則,其實就是如下3個步驟:

1.在表中查詢,如果找到,返回該元素,找不到則繼續

2.判斷該錶是否有元表,如果沒有元表,返回nil,有元表則繼續。

3.判斷元表有沒有__index方法,如果__index方法為nil,則返回nil;如果__index方法是乙個表,則重複1、2、3;如果__index方法是乙個函式,則返回該函式的返回值。

lua的繼承的**

local luaman = 

local rain = {};

local sky = {}

local prarenttable =

setmetatable(rain , prarenttable);

setmetatable(sky , prarenttable);

print(rain.data);

sky.sayhello();

__newindex 元方法 __newindex用於更新。

__newindex 元方法用來對錶更新,__index則用來對錶訪問 。

當有兩個__newindex時,後面會覆蓋前面。 __index用於查詢所以輸出rains,__newindex用於更新所以updatelua賦值後改變了update中name的值。__newindex = function(table,key,value),table是本身的,key是呼叫中的name,value是updatelua。

當你給表的乙個缺少的索引賦值,直譯器就會查詢__newindex 元方法:如果存在則呼叫這個函式而不進行賦值操作。

__call 元方法

__call 元方法在 lua 呼叫乙個值時呼叫。

__tostring 元方法

__tostring 元方法用於修改表的輸出行為。

5、閉包

閉包:通過呼叫含有乙個內部函式加上該外部函式持有的外部區域性變數(upvalue)的外部函式(就是工廠)產生的乙個例項函式

閉包組成:外部函式+外部函式建立的upvalue+內部函式(閉包函式)

6、c和lua的互相呼叫

7、c#與lua的相互呼叫

(原理跟c呼叫相同都是通過堆疊的形式)

c#呼叫lua,新增luainte***ce.dll,luanet.dll,lua51.dll相關的dll檔案。啟動lua虛擬機器,把編寫好的lua檔案,用lua(是lua虛擬機器).dostring()或者lua

.dofile()對lua檔案進行呼叫。這就是c#呼叫lua。

lua呼叫c#,先編寫好c#類跟其方法。啟動lua虛擬機器,用lua.registerfunction()註冊對應的c#類及其方法。用lua.dostring(c#方法名)對其進行呼叫。

8、lua尾呼叫

function sum2(accu, n)

if n > 0 then

accu.value = accu.value + n

return sum2(accu, n-1) --< note the return here

endend

總得來說,如果所有函式的呼叫都是尾呼叫,那麼呼叫棧的長度就會小很多,這樣需要占用的記憶體也會大大減少。這就是尾呼叫優化的含義。

Lua基礎學習 Lua函式

函式主要用途 1 是作為呼叫語句使用。2 作為賦值語句的表示式使用。語法 區域性 全域性 function fun name 引數列表 函式體endfunction 定義函式關鍵字注意 1 在使用 lua 函式 變數時一定要先定義函式 變數 2 lua 函式不支援引數預設值,可以使用 or 解決。如...

Lua基礎總結

本文總結了lua資料型別,表示式,基本語法。lua單行注釋 多行注釋 全域性變數 不需要宣告,訪問乙個沒有初始化的全域性變數也不會出錯,只是結果是nil。刪除乙個全域性變數,只給他賦值nil,即b nil。lua資料型別 8種 nil,boolean,number,string,undata,fun...

Lua 語言基礎

a 陣列定義 a 1 1 a 2 3 a 3 hello world 交換變數 a,b 1,2 b,a 2,111 c 1 c c 1 function add a b return a b endprint add a,b print helle world print helle world 函...