使用Lua碰到的问题、踩坑记录

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 中查找全局函数的定义
  • 局部函数调用时, 会往上查找局部函数的定义
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值