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
  1. 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


lua 模式匹配 lua 版本选择_lua

示例1

lua 模式匹配 lua 版本选择_加载_02

示例2

如果没有定义全局变量A,func运行时会报错,如下示例3和4


lua 模式匹配 lua 版本选择_loadstring_03

示例3

lua 模式匹配 lua 版本选择_loadstring_04

示例4

因为loadstring 是在全局环境中编译他的字符串,所以运行时字符串中的变量必须在全局中有定义,或者字符串中的变量定义为局部变量。如下示例5和6


lua 模式匹配 lua 版本选择_lua 模式匹配_05

示例5

lua 模式匹配 lua 版本选择_lua_06

示例6

11、table.concat(table [, sep [, start [, end]]])中的table是数组即key值(number类型)有序的表