一个模块就是一个程序库,可以通过require来加载,然后得到一个全局变量,表示一个table。这个table就像是一个名称空间,其内容就是模块中导出的所有东西,如函数和常量。 如果模块已经加载,就返回相应的值 加载模块 1. 首先通过package.loaded判断该模块是否已经存在 2. 通过package.preload判断preload是否存在, 3.
page 控件包含一个背景和一个可滚动的容器,将子对象添加到可滚动容器后,可以触摸滚动显示子对象。 22.预加载(preload) 预加载控件在各种 UI 系统中非常常见,它可用于等待某一个事件到达或者等待资源加载。LittlevGL 的 preload 控件是基于 arc 弧形控件进行构建的,在其基础上增加了与加载相关的操作接口。preload 控...
下一步就是更新旧模块,调用update_table,最后把package.loaded[filename] update_table function 1. 这个函数用于更新旧表,首先断言这两个参数的类型是不是table。 然后遍历表里面的元素,有三种情况:数据、函数、表。 数据不做处理,让旧表保留旧的数据。 函数,需要处理upvalue值,处理完之后,替换旧表里的旧函数。
找到了就成功返回,没有就继续查找。首选查找预加载器,执行package.preload[modname],如果这里有值,这个值(必须是一个函数)就是那个加载器, 否则 require 使用 Lua 加载器去查找package.path 的路径。 如果查找失败,接着使用C加载器去查找package.cpath的路径。如果都失败了,再尝试一体化加载器(参见 package.searche...
! - end --- package.preload:table -- 保存有一些特殊模块的加载器; -- 这个变量仅仅是对真正那张表的引用,改变这个值,并不会改变require使用的表; print(package.preload) --> table: 0114FD30 --- package.loaded:table -- 用于require控制哪些模块已经被加载的表; -- 这个变量仅仅是对真正那张表的...
Lua 中有八种基本类型: nil、boolean、number、string、function、userdata、 thread 和table。 Nil 是值nil 的类型, 其主要特征就是和其它值区别开;通常用来表示一个有意义的值不存在时的状态。 Boolean 是false 与true 两个值的类型。 nil 和false 都会导致条件判断为假; 而其它任何值都表示为真。 Number 代...
如果模块未加载,require会尝试为该模块找到一个加载器(loader,代码中一抽象函数findloader表示),会现在table package.preload 中查询传入的模块名,如果在其中找到了一个函数,就以该函数作为模块的加载器。 如果require为指定的模块找到了一个Lua文件,它就通过loadfile加载文件,如果找到的是一个C程序库,就通过loadlib加...
在package.preload查找modelname, 如果preload存在,那么就把它作为loader,调用loader(L) 根据package.path的模式查找lua库modelname,这个库是通过module函数定义的,对于顶层的lua库,文件名和库名是一 样的而且不需要调用显式地在lua文件中调用module函数(在ll_require函数中可以看到处理方式),也就是说lua会根据lua文件...
4. 基于上面的代码块概念,lua进一步设计了一套模块系统,一个模块就是一个程序库,模块的结构通常就是一个table的结构。 需要注意的是,尽管标准并没有限定模块必须要设计成一个table,并将所有需要导出的函数和变量放入其中,但是约定俗成的规则建议最好这么做。
Lua可以利用table实现模块加载 方法: 从require传入的参数中获取模块名或直接自定义变量名; 初始化一个空table; 在全局环境_G中添加模块名对应的字段,将空table赋值给这个字段; 在package.loaded中设置该模块; 设置环境变量。 例如: local moduleName = ... -- 模块名,可以在这里直接指定 ...