lua基礎語法學習
文章目錄
- lua基礎語法學習
- 1. 基礎
- 2. 輸入輸出
- 3. 分支結構與循環結構
- 4. 函數
- 5. 元表與元方法
- 6. 面向對象
1. 基礎
注釋
--單行注釋--[[
多行注釋
--]]
標識符
標識符以一個字母 A 到 Z 或 a 到 z 或下劃線 _ 開頭后加上 0 個或多個字母,下劃線,數字(0 到 9)。
Lua 不允許使用特殊字符如 @, $, 和 % 來定義標識符。 Lua 是一個區分大小寫的編程語言。
關鍵詞
and | break | do | else |
---|---|---|---|
elseif | end | false | for |
function | if | in | local |
nil | not | or | repeat |
return | then | true | until |
while | goto |
其它運算符
操作符 | 描述 | 實例 |
---|---|---|
… | 連接兩個字符串 | a…b ,其中 a 為 "Hello " , b 為 “World”, 輸出結果為 “Hello World”。 |
# | 一元運算符,返回字符串或表的長度。 | #“Hello” 返回 5 |
數據類型
數據類型 | 描述 |
---|---|
nil | 這個最簡單,只有值nil屬于該類,表示一個無效值(在條件表達式中相當于false)。 |
boolean | 包含兩個值:false和true。lua中數字0是true |
number | 表示雙精度類型的實浮點數 |
string | 字符串由一對雙引號或單引號來表示 |
function | 由 C 或 Lua 編寫的函數 |
userdata | 表示任意存儲在變量中的C數據結構 |
thread | 表示執行的獨立線路,用于執行協同程序 |
table | Lua 中的表(table)其實是一個"關聯數組"(associative arrays),數組的索引可以是數字、字符串或表類型。在 Lua 里,table 的創建是通過"構造表達式"來完成,最簡單構造表達式是{},用來創建一個空表。索引從1 開始 |
Lua 把 false 和 nil 看作是 false,其他的都為 true,數字 0 也是 true
--string
a=[[
<p>表示一塊字符串</p>
]]
b="123"
a,b=b,a --交換a,b的值--table
local tbl2 = {"apple", "pear", "orange", "grape"}
a = {}
a["key"] = "value"
print(a.key) --當索引為字符串類型時可這樣用
a[10]=22
for k, v in pairs(a) doprint(k .. " : " .. v)
end
a=nil --移除引用,垃圾回收--function
function factorial1(n)local jk=5print("局部變量jk: "..jk)if n == 0 thenreturn 1elsereturn n * factorial1(n - 1)end
end
print(factorial1(5))
factorial2 = factorial1
print(factorial2(5))--匿名函數
function testFun(tab,fun)for k ,v in pairs(tab) doprint(fun(k,v));end
endtab={key1="val1",key2="val2"};
testFun(tab,
function(key,val)--匿名函數return key.."="..val;
end
);
2. 輸入輸出
-- 提示用戶輸入
print("請輸入一些文本:")
-- 讀取用戶輸入的一整行
local userInput = io.read("*line")
-- 輸出用戶輸入的內容
print("您輸入的是:" .. userInput)
3. 分支結構與循環結構
if
a = 100
if( a == 10 ) thenprint("a 的值為 10" )
elseif( a == 20 ) then print("a 的值為 20" )
elseif( a == 30 ) thenprint("a 的值為 30" )
elseprint("沒有匹配 a 的值" )
end
print("a 的真實值為: ", a )
for
--[[ 數值for
var 從 exp1 變化到 exp2,每次變化以 exp3 為步長遞增 var,并執行一次 "執行體"。
exp3 是可選的,如果不指定,默認為1。
for var=exp1,exp2,exp3 do<執行體>
end
]]function f(x) print("function") ;return x*2 ;
end
for i=0,f(5),2 do print(i) --f(5)只在開始時執行一次
end--[[ 泛型for
a = {"one", "two", "three"}
for i, v in ipairs(a) doprint(i, v)
end
]]
repeat…until
--[ 變量定義 --]
a = 10
--[ 執行循環 --]
repeatprint("a的值為:", a)a = a + 1
until( a > 15 )
while
-- 定義變量
a = 10-- while 循環
while( a < 20 )
doprint("a 的值為:", a)a=a+1if( a > 15)then--[ 使用 break 語句終止循環 --]breakend
end
4. 函數
在函數參數列表中使用三點 ...
表示函數有可變的參數
- select(‘#’, …) 返回可變參數的長度。
- select(n, …) 用于返回從起點 n 開始到結束位置的所有參數列表。
function average(...)result = 0local arg={...} -- {...} 表示一個由所有變長參數構成的數組 for i,v in ipairs(arg) doresult = result + vendprint("總共傳入 " .. select("#",...) .. " 個數")print(select(1,...))return result/select("#",...)endprint("平均值為",average(10,5,3,4,5,6))
5. 元表與元方法
__add
t={a=1}
mt={ --元表__add=function (a,b)return a.a+bend
}
setmetatable(t,mt) -- 把mt設為t的元表
--t的加法被mt的加法替換了print(t+1) --2
__index
t={a=1}
mt={__index=function (table,key)return 123end
}
setmetatable(t,mt) -- 把mt設為t的元表
print(t['abc']) --123
--t的鍵沒有abc或者t不是table時,會調用__index元方法t2={a=15}
mt2={__index={abc=456,def=789,}
}
setmetatable(t2,mt2) -- 把mt設為t的元表
print(t2['abc']) --456
__newindex
t={a=1}
mt={__newindex=function (table,key,value)-- rawset(table,key,value)-- 不能table[key]=value,因為賦值操作也會調用__newindex最后導致堆棧溢出end
}
setmetatable(t,mt) -- 把mt設為t的元表
t.abc=123 --t原本不存在鍵abc,會調用__newindex方法
print(t['abc']) --nil
--t不存在這個key或t不是表時,會調用__newindex元方法
語法糖
t={a=0,add=function(table,sum)table.a=table.a+sumend
}
t:add(10)
-- 等價于t.add(t,10)
print(t['a'])
bag={}
bmt={put=function(t,item)table.insert(t.items,item)end,take=function(t,key)return table.remove(t.items,key)end,list=function(t)return table.concat(t.items,",")end,clear=function(t)t.items={}end
}
bmt['__index']=bmt
function bag.new()local t={items={}}setmetatable(t,bmt)return t
end
local b=bag.new()
b:put("apple")
b:put("banana")
b:put("banana")
print(b:take())-- banana
print(b:list())-- apple,banana
b:clear()
6. 面向對象
Lua 的模塊是由變量、函數等已知元素組成的 table
Lua 中的類可以通過 table + function 模擬出來。
至于繼承,可以通過 metatable 模擬出來
-- 定義 Person 類
Person = {name = "", age = 0}-- Person 的構造函數
function Person.new(self,name, age)local obj = {} -- 創建一個新的表作為對象setmetatable(obj, self) -- 設置元表,使其成為 Person 的實例self.__index = self -- 設置索引元方法,指向 Personobj.name = nameobj.age = agereturn obj
end-- 添加方法:打印個人信息
function Person.introduce(self)print("My name is " .. self.name .. " and I am " .. self.age .. " years old.")
end
p=Person:new("zhangsan", 100)
p.introduce(p)
p2=Person:new("lisi", 80)
p2.introduce(p2)