文件名称:函数与闭包-从0到1抖音运营变现手册大全
文件大小:2.13MB
文件格式:PDF
更新时间:2024-06-27 10:40:15
lua
甴田 第五章 函数与闭包 以,从公开的 畁畐畉 定义中,是不存在函数原型这一数据类型的。它只存在于实现中,但和字符串、表这些数 据类型一样,参于垃圾回收的过程。 由 function foobar () 甲 return load[[ 申 return "Hello" 甴 ]] 电 end 这段代码看似会得到和前面提到的代码相同的结果:每次调用 畦畯畯畢畡畲 都会生成一个返回 畈略畬畬畯 字符串的 函数。但实际上却有所区别。 畬畯畡畤 不仅仅有编译代码的成本,而且每次会产生一个新的函数原型;而直接返 回一个函数对象,无论是否需要绑定 畵異當畡畬畵略 ,都会复用同一个函数原型。 生成函数原型有两个途径:其一是由源代码编译而来,其二可以从编译好的字节码加载得到。这些都不 在本章节细述,我们仅讨论把函数原型和 畵異當畡畬畵略 绑定在一起得到闭包的过程。 畐畲畯畴畯 是一种 畇畃畏畢番略畣畴 ,它的结构定义在 畬畯畢番略畣畴甮畨 中。它的类型为 界畕畁 畔畐畒畏畔畏 ,由于这并不是 一个公开类型,最终用户无法得到一个 畐畲畯畴畯 对象,所以 界畕畁 畔畐畒畏畔畏 没有定义在 畬畵畡甮畨 中,而存在于 畬畯畢番略畣畴甮畨。 由 #define LUA_TPROTO LUA_NUMTAGS 源代码 电甮由町 畬畯畢番略畣畴甮畨町 畐畲畯畴畯 甴男田 typedef struct Proto { 甴男由 CommonHeader; 甴男甲 TValue *k; /* constants used by the function */ 甴男申 Instruction *code; 甴男甴 struct Proto **p; /* functions defined inside the function */ 甴男电 int *lineinfo; /* map from opcodes to source lines (debug information) */ 甴男甶 LocVar *locvars; /* information about local variables (debug information ) */ 甴男男 Upvaldesc *upvalues; /* upvalue information */ 甴男甸 union Closure *cache; /* last created closure with this prototype */ 甴男甹 TString *source; /* used for debug information */ 甴甸田 int sizeupvalues; /* size of ’upvalues ’ */ 甴甸由 int sizek; /* size of ‘k’ */ 甴甸甲 int sizecode; 甴甸申 int sizelineinfo; 甴甸甴 int sizep; /* size of ‘p’ */ 甴甸电 int sizelocvars; 甴甸甶 int linedefined; 甴甸男 int lastlinedefined; 甴甸甸 GCObject *gclist; 甴甸甹 lu_byte numparams; /* number of fixed parameters */