0x01 Lua中什么值為假沮趣?
nil
false
0x02 語法舉例
- 當在一個數(shù)字后面寫 .. 時肚吏,必須加上空格以防止被解釋出錯烘浦。
- lua會自動在string 和numbers之間自動運行類型轉(zhuǎn)換槽华,當一個字符串使用算術(shù)操作符時忙灼,string就會被轉(zhuǎn)化成數(shù)字寞酿。
print("10"+2)
12.0
print(11..12)
malformed number near '11..12'
print(11 .. 12)
1112
- 默認索引從1開始家夺,默認索引優(yōu)先級大于[1]; ["a"]索引優(yōu)先級大于a。
1
local value = {"index", index="index", [1]=1}
print(value[value[1]])
Answer:
index
2
local a = 1
local b = "1"
local t = {a=1, ["a"]=2, [a]=3}
print(t.a, t["a"], t[t.a], t.b, t[b])
Answer:
2 2 nil nil nil
3.
local tmp = {["1"]="11","22",[3]="33","44"}
for i,v in ipairs(tmp) do
print(i,v)
end
Answer:
1 22
2 44
3 33
4.
local tmp = {
["1"] = "11",
"22",
[3] = "33",
"44",
"55"
}
for i,v in ipairs(tmp) do
print(i,v)
end
Answer:
1 22
2 44
3 55
- Lua 語言中字符串可以使用以下三種方式來表示:單引號間的一串字符伐弹;雙引號間的一串字符拉馋;[[和]]間的一串字符。
local stringtable = [[
local a = 1
print(a)
]]
print(stringtable)
Answer:
local a = 1
print(a)
- 多返回值如果不接收惨好,則放棄煌茴。
function f123() return 1,2,3 end
function f456() return 4,5,6 end
print(f123(),f456())
print(f456(),f123())
Answer:
1 4 5 6
4 1 2 3
0x03 對下面幾段代碼進行優(yōu)化,并簡述優(yōu)化的原理日川。
https://wuzhiwei.net/lua_performance/
https://www.cnblogs.com/YYRise/p/7082637.html
1
for _, v1 in ipairs(a) do
for_, v2 in ipairs(b) do
local x = math.sin(v1) * math.sin(v2)
end
end
優(yōu)化后
使用全局變量蔓腐,Lua預(yù)編譯在生成的指令,需要添加獲取類似以下代碼:
GETGLOBAL 0 0 ; a
GETGLOBAL 1 1 ; b
ADD 0 0 1
SETGLOBAL 0 0 ; a
Lua預(yù)編譯能夠在寄存器存儲剩余的局部變量龄句,結(jié)果在Lua中訪問局部變量非郴芈郏快散罕。
local tsin = math.sin
for _, v1 in ipairs(a) do
for_, v2 in ipairs(b) do
local x = tsin(v1) * tsin(v2)
end
end
2
for i = 1, 2000000 do
local a = {}
a[1] = 1; a[2] = 2; a[3] = 3
end
優(yōu)化后
通過給出新表合適的大小,這很容易避免那些初始的再哈希傀蓉。
for i = 1, 200000 do
local a = {true, true, true}
a[1] = 1; a[2] = 2; a[3] = 3
end
3
local s = ""
for i = 1, i < 300000 do
s = s .. 'a'
end
優(yōu)化后
在大字符串連接中欧漱,我們應(yīng)避免..。應(yīng)用table來模擬buffer葬燎,然后concat得到最終字符串误甚。
local s = ''
local t = {}
for i = 1,300000 do
t[#t + 1] = 'a'
end
s = table.concat( t, '')
b = os.clock()
0x04 編寫一個函數(shù),深度clone一個傳入的lua對象谱净。
function deepCopy(object)
local lookup_table = {}
local function _copy(object)
if type(object) ~= "table" then
return object
elseif lookup_table[object] then
return lookup_table[object]
end
local new_table = {}
lookup_table[object] = new_table
for key, value in pairs(object) do
new_table[_copy(key)] = _copy(value)
end
return setmetatable(new_table, getmetatable(object))
end
return _copy(object)
end