那么,程序里就可以保存luaL_ref这个索引值。当要调用这个函数时,就根据该索引从注册表中取出(大概是lua_gettable)。实际操作你可以自己查查。这种方式感觉上效率应该会高不少,对于脚本方的使用也更自由。但是有个严重的问题,就是当我们进行效率检查时,定位脚本不太容易,因为C/C++这边没有有效的方式去标识一个lua函...
} 在luaV_gettable中,会先扫描是否有RKC(i)的值。即上文提到的s[s’]=x[‘x’’]中的[s’]。如果有则返回,直接读取;否则扫描TM_INDEX字段,然后判断里面是否函数,如果是则进入调用。代码如下: void luaV_gettable (lua_State *L, const TValue *t, TValue *key, StkId val) { int loop; for (...
但Lua解释器为了避免出现不必要的麻烦(循环定义),把这种情况给Kick掉了,如果这样写,会报错,并提示 loop in gettable 说真的,这样定义也确实没什么用处。 下面开始正式进入面向对象的实现。先引用一下Sputnik中的实现片断, localSputnik = {}localSputnik_mt = {__metatable= {},__index= Sputnik}functionnew(con...
api_checkvalidindex(L, t); luaV_gettable(L, t, L->top - 1, L->top - 1); lua_unlock(L); } void luaV_gettable (lua_State *L, const TValue *t, TValue *key, StkId val) { int loop; for (loop = 0; loop < MAXTAGLOOP; loop++) { const TValue *tm; if (ttistable(t)...
loop in gettable 说真的,这样定义也确实没什么用处。 下面开始正式进入面向对象的实现。先引用一下Sputnik中的实现片断, local Sputnik = {} local Sputnik_mt = {__metatable = {}, __index = Sputnik} function new(config, logger) -- 这里生成obj对象之后,obj的原型就是Sputnik了,而后面会有很多的Sputn...
调用luaV_gettable取表的字段,其中: 调用luaV_fastget取字段,如果失败则调用luaV_finishget,这里面就会使用元方法 通过fasttm或luaT_gettmbyobj得到元方法后,判断它是否为函数,如果为函数则调用luaT_callTM,否则它应该是一个表,则继续这个过程。 假如一直这个循环,直到MAXTAGLOOP次,则Lua直接报错,说明这个__index...
try the tag method */ } else if (ttisnil(tm = luaT_gettmbyobj(L, t, TM_INDEX))) luaG_typeerror(L, t, "index"); if (ttisfunction(tm)) { callTMres(L, val, tm, t, key); return; } t = tm; /* else repeat with `tm' */ } luaG_runerror(L, "loop in gettable"); }...
以取一个变量下标指向的量 t[i] 等价于调用 gettable_event(t,i)。 (参见 §2.8 ,有一份完整的关于 gettable_event 函数的说明。 这个函数并没有在 lua 中定义出来,也不能在 lua 中调用。 这里我们把它列出来只是方便说明。) var.Name 这种语法只是一个语法糖,用来表示 var["Name"]: 代码语言:...
-lua_gettable -lua_gettop -lua_getupvalue -lua_insert -lua_isboolean -lua_iscfunction -lua_isfunction -lua_islightuserdata -lua_isnil -lua_isnone -lua_isnoneornil -lua_isnumber -lua_isstring -lua_istable -lua_isthread -lua_isuserdata -lua_lessthan -lua_load -lua_newstate -lua_new...
gettable_event(_env, "x") 这里,_env是当前运行的函数的环境。 (函数gettable_event的完整说明参见§2.8。 这个函数并没有在 lua 中定义出来,也不能调用。 当然,_env这个变量也同样没有在 Lua 中定义出来。 我们在这里使用它们,仅仅只是方便解释而已。) ...