lua的坑(持续更新,每日更新两篇,9/15),更新到17个

  • 转载自:https://blog.csdn.net/weixin_43994445/article/details/109135215

1.把数值转成16进制的格式

print(string.format('%x', 1221197823))

输出:
48c9ffff

在这里插入图片描述

2.去掉商里的小数

  • 背景:用"/"来做除法, 得到的结果中总会带有小数, 像这样:
print(700 / 100)
print(701 / 100)

输出:
7.0
7.01
  • 需求:当结果是7.0时去掉小数部分, 当结果是7.01的时候要保留小数部分
  • 思路:
local t1, t2 = math.modf(700 / 100)
print(t1)
print(t2)

输出:
7      --t1是7
0.0	   --t2是0.0,存的小数部分
function GetFixedQuotient(num1, num2)
    quotient = num1 / num2
    local t1, t2 = math.modf(quotient)
    -- 去掉数字后面的.0
    if t2 == 0 then
        return t1  		//t1是整数
    else
        return quotient //quotient是整数+小数
    end
end
print(GetFixedQuotient(700, 100))
print(GetFixedQuotient(701, 100))

输出:
7
7.01

3.string.format()保留三位小数

print(string.format('%.3f',0.5))
print(string.format('%.3f',0.0005))
print(string.format('%.3f',0.0004))
print(string.format('%.3f',500))

输出:
0.500
0.001(这里四舍五入了)
0.000(这里四舍五入了)
500.000

4.向上/下取整,四舍五入

1.取整
print('向上取整:1/3 = ' .. math.ceil(1/3))
print('向下取整:1/3 = ' .. math.floor(1/3))

2.四舍五入
print('四舍五入:1/3 = '..math.floor(1/3 + 0.5))
print('四舍五入:2/3 = '..math.floor(2/3 + 0.5))

3.保留三位小数的四舍五入
print('四舍五入:1/3 = '..math.floor(1/3*1000 + 0.5)/1000)
print('四舍五入: 2 / 3 = ' .. math.floor(2 / 3 * 1000 + 0.5) / 1000)

输出:
向上取整: 1 / 3 = 1
向下取整: 1 / 3 = 0
四舍五入: 1 / 3 = 0
四舍五入: 2 / 3 = 1
四舍五入: 1 / 3 = 0.333
四舍五入: 2 / 3 = 0.667


4.但是以上代码如果处于0.5会有错误,下面是优化的代码
local function round(x)    
	local data1,data2 = math.modf(x)    
	if(x >= 0) then        
		if(0.5 <= math.abs(data2)) then            
			return data1+1        
		else            
			return data1        
		end    
	end        
	if(0.5 <= math.abs(data2)) then        
		return data1-1    
	else        
		return data1    
	end
end

local l1 = round(3.5)
local l2 = round(3.4)
local l3 = round(3.6)
local l4 = round(-3.2)
local l5 = round(-3.6)
print(l1,l2,l3,l4,l5)

//----------------------------
[root@legend2 codeTrain]# lua test8.lua 4       3       4       -3      -4

5.string字符串拆成表

input = "ab23^&*)$大大大"
tabA={}
for i=1,#input do
	let = string.sub(input,i,i)//let就是单个字符
	table.insert(tabA,i,let)   //插入表tabA,i对应字符
	print(i,let)
end
  • 效果
root@iZbp1do67v9l7zwkcs2b22Z:~/kunmk/test/lua# lua test.lua 
1       a
2       b
3       2
4       3
5       ^
6       &
7       *
8       )
9       $
101112131415161718

6.敏感词过滤

input = 'ABc大大大'
word = 'bc大'
lower = string.lower(input)
result = lower
if string.find(lower, tostring(word)) ~= nil then
    -- 汉字占3个字符, 所以不能直接用string.len()
    local _, count = string.gsub(word, '[^\128-\193]', '')
    print(count)
    local stars = string.rep('*', count)
    print(stars)
    result = string.gsub(lower, tostring(word), stars)
end
print(result)
  • 效果

root@iZbp1do67v9l7zwkcs2b22Z:~/kunmk/test/lua# lua test.lua
3
***
a***大大

7.同名传参/同名字段相关bug

1)2个同名传参, 第1个传参无效

function Do(arg, arg)
    print(arg)
end
Do(1, 2)

输出:
2

2)2个同名字段, 第2个字段无效

a, a = 1, 2
print(a)

输出:
1

8.表作为传参: 浅拷贝的相关bug

1)表作为参数传递时, 是浅拷贝,原表也会改变

如下↓, 改变"参数表"(arg)的内容, “原来的表”(tab)也会改变

function ReName(arg)
    arg.name = '咸蛋超人'
end
tab = {name = '奥特曼'}
ReName(tab)
print(tab.name)

输出:
咸蛋超人

2)但是, 改变arg表自身, tab不变

function ReName(arg)
    arg = {name = '咸蛋超人'}
end
tab = {name = '奥特曼'}
ReName(tab)
print(tab.name)

输出:
奥特曼

9.windwos安装lua

传送门

10.通配符,正则表达式

s = "abc \"it's a cat\""
_, _, _, d = string.find(s, "([\"'])(.-)%1")
print(d) -----输出: it's a cat

11.用正则实现trim()

name = '   蒂纳  奥特曼  '
local _name = string.gsub(name, '^%s*(.-)%s*$', '%1')
print(_name)

输出:蒂纳  奥特曼

12.字符串截取string.sub()的使用方法

s = 'abcde'

print(string.sub(s, 1, 3)) --1数到3
print(string.sub(s, 3, 3)) --3数到3
print(string.sub(s, 3)) --3数到末尾
print(string.sub(s, 8)) -- 没有8,直接空了
print(string.sub(s, 3, -1)) --3数到5(末尾)
print(string.sub(s, 3, -2)) --3数到4(末尾-1)
print(string.sub(s, -4, -2)) --2(末尾-3)数到4(末尾-1)
print(string.sub(s, -9))-- 从头数到尾

-- 输出:
abc
c
cde

cde
cd
bcd
abcde

13.数组增删

数组能用, 字典不行

table.insert(list, [pos, ]value), -- 不给pos就是#list+1
table.remove(list[, pos]), -- 不给pos就是#list

注意: 在for的时候, 要从后往前删

14.if后面跟一个方法, 这个方法会运行

function fun()
    print(2)
end
if fun() then
end

输出: 2

↓写成这样则不执行

if fun then
end

15、// 运算, 取商

//是取商符号

print(5 // 2)
print(5.0 // 2)
print(5 // 2.0)

输出:
2
2.0
2.0
注意: 当被除数或除数为浮点数时, 结果也是浮点数

16、按位运算

a~b 按位异或
~a 按位取反

17、方法后面不加小括号

function aaa(t)
    print(t[1])
end
--因为传参是table, 所以可省略小括号
--正常写法为:
a = aaa({2, 3})
--省略写法为:
a = aaa {2, 3}

----
a = aaa{"a", "b"}
》打印"a"

18、返回多个值

function fun()
    return 1, 2, 3
end
print("额", fun()) 
print(fun(), "额") -- 因为fun不是最后一个, 所以只返回一个值
print((fun())) -- 强制仅返回一个值

输出:1	2	3
11

19、实现continue

  • 思路
    思路: 用一次性while里的if-break作为continue
for i = 1, 10 do
    while true do
        if i > 3 and i < 8 then
            break
        end
        print(i)
        break
    end
end
输出:
1 2 3 8 9 10

20、虚变量

(虚设变量/ 虚拟变量/ 名义变量/ 哑元变量/ 哑变量 叫啥玩意都行)

t = {'迪迦', '戴拿', '蒂格', '蒂纳'}
for k, v in pairs(t) do
    print(v)
end
->↓此写法表示: 我不需要理会k这个变量 ,, 虚变量

t = {'迪迦', '戴拿', '蒂格', '蒂纳'}
for _, v in pairs(t) do
    print(v)
end

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值