0x01 Lua中什么值为假?
1 | nil |
0x02 语法举例
- 当在一个数字后面写 .. 时,必须加上空格以防止被解释出错。
- lua会自动在string 和numbers之间自动运行类型转换,当一个字符串使用算术操作符时,string就会被转化成数字。
1 | print("10"+2) |
- 默认索引从1开始,默认索引优先级大于[1]; [“a”]索引优先级大于a。
1 | 1 |
- Lua 语言中字符串可以使用以下三种方式来表示:单引号间的一串字符;双引号间的一串字符;[[和]]间的一串字符。
1
2
3
4
5
6
7
8
9 local stringtable = [[
local a = 1
print(a)
]]
print(stringtable)
Answer:
local a = 1
print(a)
- 多返回值如果不接收,则放弃。
1
2
3
4
5
6
7
8 function () 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 对下面几段代码进行优化,并简述优化的原理。
https://wuzhiwei.net/lua_performance/
https://www.cnblogs.com/YYRise/p/7082637.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 1
for _, v1 in ipairs(a) do
for_, v2 in ipairs(b) do
local x = math.sin(v1) * math.sin(v2)
end
end
优化后
使用全局变量,Lua预编译在生成的指令,需要添加获取类似以下代码:
GETGLOBAL 0 0 ; a
GETGLOBAL 1 1 ; b
ADD 0 0 1
SETGLOBAL 0 0 ; a
Lua预编译能够在寄存器存储剩余的局部变量,结果在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
1 | 2 |
1 | 3 |
0x04 编写一个函数,深度clone一个传入的lua对象。
https://2013.mutoo.im/2015/10/deepclone-in-lua.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 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