之前一直以为函数不写return就是默认返回nil,然而实际上是有区别的。
测试代码如下:
function FuncNoReturn()
end
function FuncReturnNil()
return nil
end
local b = FuncReturnNil()
local a = FuncNoReturn()
local t = {}
table.insert(t,FuncReturnNil())
table.insert(t,FuncNoReturn())
很明显a和b的值都是nil,而第二个insert会报错:“wrong number of arguments to insert”。错误的参数数量。
原因在于,函数return时会把值压入栈,如果函数调用作为右值或者函数的形参,参数会从栈上读取。而如果不return,栈上就不会有值。
所以上面的测试代码实际上等同于:
local b = nil
local a
local t = {}
table.insert(t,nil)
table.insert(t)
而我们知道,local a的默认值是nil。这里跟将b赋值为nil是不一样的。
而两个insert调用,第一个形参数是2,即使插入的值是nil也没有问题,只是t依然是空表而已。但第二个的形参不满,所以会直接报错了。