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 函...