1、函数是一种 “第一类值”
a = {p = print};
a.p("hello");
a = print;
a("Hi");
2、 table 提供的函数 table.sort
network = {
{name = "lua", IP = "192.168.1.1"},
{name = "CPP", IP = "192.168.1.2"}
};
for i,v in pairs(network) do
print(i, v.name, v.IP);
end;
table.sort(network, function(a,b) return (a.name < b.name) end);
print("sorted");
for i,v in pairs(network) do
print(i, v.name, v.IP);
end;
3、closure 闭合函数,内部函数可以使用外部函数的变量
function newCounter()
local i = 0;
print("init"); --仅执行一次
return
function () --匿名函数, 内部函数不要写上函数名
print("inner function");
i = i + 1;
return i;
end;
end;
c1 = newCounter(); -- 执行 newCounter() return 前的代码,然后将匿名函数返回
print(c1()); --> 1
print(c1()); --> 2
print(c1()); --> 3
print(c1()); --> 4
c2 = newCounter();
print(c2()); -->1
4、使用closure 创建一个安全的运行环境
do
local oldOpen = io.open;-- 暂时保存
local access_OK = function(filename, mode) --做验证处理
-- 验证的代码
end;
io.open = function(filename,mode)
if access_OK(filename, mode) then
return oldOpen(filenmae, mode);
else
return nil, "access dinied";
end;
end;
end;
-- 这样,io.open 就加上了验证的功能
5、尾调用,类似于goto, 尾调用不会耗费栈空间
注:只有 return func() 这样的调用形式才算是一个“尾调用”
以下调用不符合:
return g(x)+1;
return x or g(x);
return ((g(x)); // 要调整为一个返回值
我觉得使用尾调用,就是为了避免过多的函数调用导致的栈溢出。
而使用的方法也很简单,就是确保最后一条语句是 return func(); 不带任何操作
Lua chapter 5