首页 > 代码库 > Lua chapter 5

Lua chapter 5

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();  不带任何操作