Lua 源码分析之闭包Closure

        闭包是Lua语言编程一个重要而又常用的概念。它主要作用是在函数离开作用域后还可以访问外部的临时变量,这些变量称为upvalue。
        闭包分为两种,分别CClosure和LClosure。它们都被封装到一个Closure结构体里,CClosure和LClosure都有一个ClosureHeader的结构体。结构体ClosureHeader的字段作用:
        1.isC: 区分是哪一种闭包类型。0是LClosure, 1是CClosure
        2.nupvalues:记录upvalue的数量。

#define ClosureHeader \
	CommonHeader; lu_byte isC; lu_byte nupvalues; GCObject *gclist; \
	struct Table *env

typedef struct CClosure {
  ClosureHeader;
  lua_CFunction f;
  TValue upvalue[1];
} CClosure;


typedef struct LClosure {
  ClosureHeader;
  struct Proto *p;
  UpVal *upvals[1];
} LClosure;


typedef union Closure {
  CClosure c;
  LClosure l;
} Closure;

这里我们主要分析LClosure的情况。例如以下创建闭包的代码

function test()
	local a = 1
	local function callback()
		print(a)
	end
	return callback
end
local cb = test()
cb()

    在调用test函数时,创建一个lo

你可能感兴趣的:(lua,一步一步嚼懂Lua源码,lua,Closure,闭包,源码)