下一步就是更新旧模块,调用update_table,最后把package.loaded[filename] update_table function 1. 这个函数用于更新旧表,首先断言这两个参数的类型是不是table。 然后遍历表里面的元素,有三种情况:数据、函数、表。 数据不做处理,让旧表保留旧的数据。 函数,需要处理upvalue值,处理完之后,替换旧表里的旧函数。
如果模块尚未加载,require就是这为该模块找到一个加载器(loader),会现在table package.prelado中查询传入的模块名。如果在其中找到了一个函数,就会以该函数作为模块的加载器。通过preload table,就有了一种通用的方法来处理各种不同的情况。 如果require找到了一个lua文件,他就通过loadfile来加载文件。而如果找到的是...
找到了就成功返回,没有就继续查找。首选查找预加载器,执行package.preload[modname],如果这里有值,这个值(必须是一个函数)就是那个加载器, 否则 require 使用 Lua 加载器去查找package.path 的路径。 如果查找失败,接着使用C加载器去查找package.cpath的路径。如果都失败了,再尝试一体化加载器(参见 package.searche...
首先在package.loaded查找modelname,如果该模块已经存在,就直接返回它的值 在package.preload查找modelname, 如果preload存在,那么就把它作为loader,调用loader(L) 根据package.path的模式查找lua库modelname,这个库是通过module函数定义的,对于顶层的lua库,文件名和库名是一 样的而且不需要调用显式地在lua文件中调用mod...
--- package.preload:table -- 保存有一些特殊模块的加载器; -- 这个变量仅仅是对真正那张表的引用,改变这个值,并不会改变require使用的表; print(package.preload) --> table: 0114FD30 --- package.loaded:table -- 用于require控制哪些模块已经被加载的表; ...
预加载控件在各种 UI 系统中非常常见,它可用于等待某一个事件到达或者等待资源加载。LittlevGL 的 preload 控件是基于 arc 弧形控件进行构建的,在其基础上增加了与加载相关的操作接口。preload 控件的构成是一个封闭的弧形背景,一个颜色不同的弧形进行旋转。
当lua检测到w中没有某字段,而其元表中却有一个__index字段,那么lua就会以w来调用这个__index元方法。随后元方法用这个key来索引原型table __index元方法不必一定是一个函数,还可以是一个table。 当它使一个函数时,lua以table和不存在的key座位参数来调用该函数,而当它是一个table时,lua就以相同的方式来重新...
当require一个模块mod.sub时,require会用原始的模块名“mod.sub”作为key来查询table package.loaded和package.preload,其中,模块名中的点在搜索时没有任何意义。但是,当搜索一个定义子模块的文件时,require会将点转换成另一个字符,通常就是系统的目录分隔符,转换之后require就像搜索其他名称一样来搜索这个名称。比如...
我们先了解一下Lua有哪些基本类型,Lua有8种基本类型:nil, number, string ,table, function, boolean, userdata, thread。 下面一一介绍一下: 2.2.1、nil nil代表空,变量定义出来在第一次赋值之前是空的,目的用于告诉lua它是没有初始化的。注意nil在lua里面只有赋值操作=,和判断操作==,~=才有效,其它操作符...
For instance, a C library statically linked to Lua can register its luaopen_ function into the preload table, so that it will be called only when (and if) the user requires that module. In this way, the program does not waste time opening the module if it is not used. ...