PS:随时记录遇到的小知识和版本变化
1、5.2 版本之后,require 不再定义全局变量,需要保存其返回值 eg:require "XXX.Test" 改成 Test = require "XXX.Test"
2、5.1版本之后math.mod 被math.fmod替换,
string.gfind被 string.gmatch替换,
table.getn被 ‘#’替换,loadlib被package.loadlib替换,
旧版函数是否还可以使用,需要查看当前使用的Lua版本文件luaconf.h(5.1之后才有)中是否有兼容
3、5.1版本之后table.setn、table.foreach、table.foreachi被舍弃了
4、5.1版本之后string.gsub当第三个参数是函数时,如果这个函数返回nil或false,替代会是整个字符串,而不是返回一个空字符串。require获取包路径改为
package.path而不是
LUA_PATH,其他与旧版本兼容。
5、pairs和ipairs区别
1)、pairs: 迭代 table,可以遍历表中所有的 key 可以返回 nil,输出时不会显示nil
2)、ipairs: 迭代数组,不能返回 nil,如果遇到 nil 则退出 。
local ttt = {"dadda",78,nil,"ddddd"}
for i,v in ipairs(ttt) do
print(i,v)
end
[LUA-print] 1 dadda
[LUA-print] 2 78
for k,v in pairs(ttt) do
print(k,v)
end
[LUA-print] 1 dadda
[LUA-print] 2 78
[LUA-print] 4 ddddd
- 3)、ipairs只是按照表中索引升序遍历,遇到value值是nil或者第一个不是整数的key时便停止遍历。pairs能遍历表中所有的key
local ttt = {
[1] = "ttt1",
[2] = "ttt2",
["nil"] = "ttt3",
["a"] = "ttt4",
[3] = "ttt5",
b = "ttt6",
}
for k,v in ipairs(ttt) do
print(k,v)
end
[LUA-print] 1 ttt1
[LUA-print] 2 ttt2
[LUA-print] 3 ttt5
for k,v in pairs(ttt) do
print(k,v)
end
[LUA-print] 1 ttt1
[LUA-print] 2 ttt2
[LUA-print] 3 ttt5
[LUA-print] b ttt6
[LUA-print] nil ttt3
[LUA-print] a ttt4
6、luaconf.h 是lua的配置文件,定义了动态库操作(重中之重),异常及错误处理,打印数据格式,数字运算,C Stack,GC等方面。ps:参考资料:
7、table.maxn在Lua5.2以上版本中已无法使用,获取中最大的key值(number类型)
8、多次require同一个模块返回的是同一个表,因为require会把结果存放在package.loaded表中,执行require的时候会优先判断package.loaded表里是否存在,如果存在则直接返回,否则会进行本地加载。
9、loadfile dofile require的区别
1)、loadfile加载文件后只是编译代码,并不运行其中的代码
2)、dofile加载文件后会编译代码,并且运行其中的代码
3)、require通过搜索目录加载文件后会编译代码,并且运行其中的代码
注:dofile和require功能相似,但require第二次加载文件时不会重复运行其中的代码,即require不会重复加载同一个文件。若要让每次加载文件都运行,可使用dofile;
若加载后不运行,等需要时运行,可使用loadfile。dofile和loadfile参数都是绝对路径。
10、loadstring(string[,chunkname]) 加载一段字符串代码块,但不运行,返回一个函数,需要执行时调用返回的函数即可,chunkname用作错误信息和调试信息的块名称。如下示例1和2
示例1
示例2
如果没有定义全局变量A,func运行时会报错,如下示例3和4
示例3
示例4
因为loadstring 是在全局环境中编译他的字符串,所以运行时字符串中的变量必须在全局中有定义,或者字符串中的变量定义为局部变量。如下示例5和6
示例5
示例6
11、table.concat(table [, sep [, start [, end]]])中的table是数组即key值(number类型)有序的表