好奇的探索者,理性的思考者,踏实的行动者。
Table of Contents:
1.创建一个_class函数
a)在函数中创建一个table,并把__index
字段设置成自己,目的是让生成的对象把自己的原表设置成这个table
b)继承其他类(把父类的字段都复制过来)
2.创建一个Object基类,实现一个new方法,new方法会创建一个table,并设置table的原表为当前的类,并return
【table也可以做key】
原理可能是每个table都有一个唯一的码,用这个码作为table的key
local cfg = { a = 'aaa', b = 'bbb', c = 'ccc'}
local a = {}
[cfg] = 11111
aprint(a[cfg])
注意传值的方式
local cfg = { a = 'aaa', b = 'bbb', c = 'ccc'}
local cfg2 = cfg
cfg2.a = 'ccc' 会改变cfg的值
cfg2 = {d = 'ddd'} 不会
cfg2 = 1 不会
x = 5
a = {} -- 空表
b = { key = x, anotherKey = 10 } -- 字符串作键
c = { [x] = b, ["string"] = 10, [34] = 10} -- 变量和字面量作键 , 注意:不要用未赋值的变量做key
local i = {[1]=1,[2]=2,1111}
print(i[1]) -- 1111 i[2] -- 2 原因是1 被覆盖 掉了
a = { x = 400, y = 300, [20] = "foo" }
b = { 20, 30, 40 }
c = {[111] = 111, [222] = 222}
for key, value in pairs(c) do ipairs 只对b有效
print(key, value)
end
a = {[2] = 123, [3] = 345}
dump(#a) 索引不是从1开始的话长度就是零
Lua的table操作:
t = { 24, 25, 8, 13, 1, 40 }
table.insert(t, 50) -- 附加50
table.insert(t, 3, 89) -- 在索引3处插入89
table.remove(t, 2) -- 删除第2项
table.sort(t) -- 使用 < 运算符排序
local s = table.concat( t, '\n' )
do
function foo(...)
for i = 1, select('#', ...) do //get the count of the params
local arg = select(i, ...) //select the param
print("arg", arg);
end
end
foo(1, 2, nil, 4);
end
function f(...)
for i,v in pairs({...}) do
print(i..'--------'..v)
end
end
变长参数unpack({...})
如果中间有nil后边的就会被 丢弃掉
【pcall】
指的是 protected call 类似其它语言里的 try-catch, 使用pcall 调用函数,如果函数 f 中发生了错误, 它并不会抛出一个错误,而是返回错误的状态, 为被执行函数提供一个保护模式,保证程序不会意外终止
local success, resultOrErrorMessage = pcall( f , arg1,···)
// success: 没有错误返回 true, 有错误返回 false
// resultOrErrorMessage: 发生错误返回错误信息,否则返回函数调用返回值
【xpcall】
xpcall
,xpcall 中的 "x" 代表 "eXtended",即扩展的意思。允许你指定一个专门用于处理错误的函数。这有助于更灵活地处理错误情况。
function myfunction ()
= n/nil
n end
function myerrorhandler( err ) -- err 是异常的信息
print( "ERROR:", err )
end
local success, resultOrErrorMessage = xpcall( myfunction, myerrorhandler )
print( status, resultOrErrorMessage)
print(debug.traceback()) 可以打印调用栈
【heredoc】
html = [[
<html>
<head></head>
<body>
<a href="http://www.w3cschool.cc/">w3cschool菜鸟教程</a>
</body>
</html>
]]
在对一个数字字符串上进行 算术操作 时,Lua 会尝试将这个数字字符串转成一个数字:
使用 # 来计算字符串的长度,放在字符串前面,如下实例:
len = "www.w3cschool.cc"
print( #len )
print(#" www.w3cschool.cc")
t[i] => t.i
当索引为 字符串类型 时的一种简化写法
a, b, c = 0
print(a,b,c) --> 0 nil nil
上面最后一个例子是一个 常见的错误情况 ,注意:如果要对多个变量赋值必须依次对每个变量赋值。
赋值语句不会返回所赋的值 ,所以foo(a = 3)和a = b = 1导致语法错误。
x, y = y, x -- swap 'x' for 'y'
a[i], a[j] = a[j], a[i] -- swap 'a[i]' for 'a[j]'
repeat
print("a的值为:", a)
= a + 1
a until( a > 15 )
^指数运算,例如10 ^ 2输出100,大多数语言中,^表示XOR。
_G
里面存了所有的全局变量:
a = 3
print(_G.a) -- 3
_G.b = 4
print(b) -- 4
print(_G._G == _G) -- true
命令行参数存储在arg表中,假定你有一个foo.lua脚本:
print(arg[-1], arg[0])
for i, v in ipairs(arg) do print(v) end
文件中的...
由于文件以函数的方式加载,所以我们可以用上...。假定bar.lua内容如下:
print(...) -- 输出所有传递给该文件函数的 参数
以如下语句加载:
loadfile("bar.lua")(1, 2, 3, 4)
输出为1 2 3 4.
function foo()
local x, y = something(4, 5)
return x ^ y
end
function something(arg1, arg2)
local ret1 = (arg1 * arg2) ^ 2
local ret2 = (arg1 - arg2) ^ 2
return ret1 + ret2, ret1 * ret2
end
上面的代码说明 定义函数的先后顺序 没有关系,这和C、C++等编译型语言不同。
a = '<text textColor=0xffff00 text=尊貴的VIP>'
b = '<btn text=點擊查看 noboard=true textSize=14 tasktype=comactfirst arg1=$id underline=true textColor=0x00ff00 >'
-- 括号代表要匹配的内容
-- .代表任意
-- %s代表空格
-- %>特殊的字符要转义
pat = 'text=(.-)%s'
pat1 = 'text=(.-)%>'
aa = string.gsub(a,pat1,'')
print(aa)
string.gsub("hello 42", "(%d+)", "%1 3") -- hello 42 3 -- %1 代表的是 被匹配的字符串
string.gsub("heLLo", "(%u)", "") -- heo
-- 4 + 4 = 8 还能传回调
string.gsub("2 + 2 = 4", "(%d)", function(s)
return s * 2
end)
-- 打印每个单词
for w in string.gmatch("good morning chaps", "%w+") do
print(w)
end