文章目录
- 1. 获得整除结果
- 2. 在数组末尾添加元素的两种写法
- 3. 接收可变参数 '...'
- 4. 复杂表结构的定义
- 5. 一行代码, 同时定义多个变量
- 6. 数组与集合的遍历方式
- 7. 函数声明和调用的位置关系
1. 获得整除结果
用 “/” 来做除法, 得到的结果中总会带有小数. 可以使用 math.modf()
和 math.floor()
来获得结果中的整数部分:
print(10/3)
print(math.modf(10/3))
print(math.floor(10/3))
--------输出结果--------
3.3333333333333
3 0.33333333333333
3
此外, 如果被除数是整数的话,我们也可以使用 ‘//’ 来进行取商
print(7//2)
print(7.0//2) --PS: 当被除数或除数为浮点数时, 结果也是浮点数
--------输出结果--------
3
3.0
2. 在数组末尾添加元素的两种写法
local tb = {}
tb[#tb + 1] = {name='zhangsan'}
for _, data in pairs(tb) do
print(data.name)
end
table.insert(tb, {name='lisi'})
for _, data in pairs(tb) do
print(data.name)
end
--------输出结果--------
zhangsan
zhangsan
lisi
3. 接收可变参数 ‘…’
使用 table.pack() 接收可变参数, 返回用所有参数以键 1,2, 等填充的新表, 并将 “n” 这个域设为参数的总数:
function Test(...)
local arg = table.pack(...)
for k, v in pairs(arg) do
print('(key, value) -> ' .. k .. ', ' .. v)
end
print('length: ' .. arg.n)
end
Test('你好', nil, nil, '世界')
--------输出结果--------
(key, value) -> 1, 你好
(key, value) -> 4, 世界
(key, value) -> n, 4
length: 4
4. 复杂表结构的定义
在定义一个表时, 可以顺便在表中完成表成员的定义:
local actived = {skill={}, fetter = {}, n = 0}
print(type(actived.skill))
print(type(actived.fetter))
print(type(actived.n))
print(actived.n)
--------输出结果--------
table
table
number
0
5. 一行代码, 同时定义多个变量
local t1, t2, a = {}, {}, 10
print(type(t1))
print(type(t2))
print(type(a))
--------输出结果--------
table
table
number
6. 数组与集合的遍历方式
遍历数组使用 ipairs
, 遍历时 key 按照 [1, 2, 3, 4…] 的顺序递增, 直到 value = nil 时结束遍历
-- 例子1
table = { [3] = "val3", [4] = "val4" , [8] = "val8", [9] = "val9" }
print("-----------ipairs_test1----------------")
for k,v in ipairs(table) do
print(k,v)
end
-- 例子2
table = { [1] = "val1", [2] = "val2" , [8] = "val8", [9] = "val9" }
print("-----------ipairs_test2----------------")
for k,v in ipairs(table) do
print(k,v)
end
编译运行:
遍历集合的话使用 pairs
, 他会无序地遍历表中所有的 key 值,当 value 为 nil 时不输出,但不会停止遍历:
-- 例子1
table = { [3] = "val3", [4] = "val4" , [8] = "val8", [9] = "val9" }
print("-----------ipairs_test1----------------")
for k,v in pairs(table) do
print(k,v)
end
-- 例子2
table = { [1] = "val1", [2] = "val2" , [8] = "val8", [9] = "val9" }
print("-----------ipairs_test2----------------")
for k,v in pairs(table) do
print(k,v)
end
7. 函数声明和调用的位置关系
- 使用
function
声明的函数(全局函数)时,调用时不会因为声明的顺序找不到 - 使用
local function
声明的函数(局部函数)时,调用必须在函数声明之后
function test()
test1()
test2()
end
function test1()
print("test1")
end
local function test2()
print("test2")
end
test()
编译之后报错
lua5.3: prog.lua:5: attempt to call a nil value (global ‘test2’)
解决
- 将 local function test2 的声明放到 function test 前面
- 将 local function test2 修改为function test2
原理
- 全局函数的定义存储在 _G 中, 调用时会直接到 _G 中查找全局函数的定义
- 局部函数调用时, 会往上查找局部函数的定义