Corona支持lua模块功能,以创建和加载附加的库。有许多库都携带在sdk里。两个典型的例子库是:“ui.lua”(用来创建翻滚按钮)和“sprite.lua”(用来创建动画精灵,或“ movieclips”)。
这些库可以在“Button”和“MoiveClip”例子工程中找到,位于SDK的SampleCode目录里。为了在你自己的项目中引用之,你需要将他们拷贝到你的项目目录里。
你也可以创建你自己的lua模块,其对于组织多个文件到一个大项目中很有用。或者为将来的项目创建可重用的代码库。
创建扩展库
最容易使用的方法是用下面格式来创建一个模块,并且将其保存进你项目的main.lua文件的相同的目录下:
1
2
3
4
5
6
module(..., package.seeall)
-- Declare the functions you want in your module
function hello()
print ("Hello, module")
end
第一行要象这个例子一样,也包含三个点。模块应该被存储为一个“.lua”文件扩展名:例如“testlib.lua”。
加载扩展库
为了从你的项目目录中加载模块,请在你的main.lua文件的开头require(modname)。模块中的函数要用 modname.functionname() 格式来调用。
你可以通过本地变量来缓存库函数,优化你的main.lua。
1
2
3
4
5
6
7
8
9
10
11
12
13
-- 加载扩展库 (should be in the same folder as main.lua)
local testlib = require("testlib")
-- Now the functions in "testlib.lua" are available here:
-- call the testlib library function hello(). The "slow" way
testlib.hello()
-- cache same function, if you call more than once
local hello = testlib.hello
-- now all future invocations are "fast"
hello()
语法
module (name [, ···])
创建一个模块。如果 package.loaded[name]中有一个table,这个table是模块。否则,如果有一个全局的table使用给定的name,这个table就是模块。否则创建一个新的table,并且设置它的值到全局name,以及 package.loaded[name]的值。这函数也会用给定的name初始化t._NAME,用模块(t自身)初始化t._M,以及用包名来初始化t._PACKAGE(完整的模块名减去最后一部分,参看下面)。最后,模块设置t作为当前函数的全局环境,以及 package.loaded[name]的新值,所以requie返回t。
这个函数可能收到一个在modname后的可选的参数option,每个option是从模块导出的函数。
require (modname)
加载给定的模块。这个函数开始寻找package.loaded的table来确定modname模块是否已经被加载。如果是,那么require返回存储在package.loaded[modname]的值。否则,它将尽力寻找模块的一个加载器。
为了找到一个loader,require遍历package.loaders数组。通过改变这个数组,我们可以改变require如何查找一个模块。下面的解释是基于默认package.loaders的配置。
首先,require查询 package.preload[modname]。如果有一个值,这个值(应该是一个函数)是加载器。否则require用 package.path存储的路径去搜索一个lua加载器。如果还是失败了,它会使用一个万能加载器(参看package.loaders)。
一旦一个加载器被发现,require用单个参数,modname来调用加载器。如果加载器返回任何值,require把这个返回值赋于 package.loaded[modname]。如果加载器没有返回值,并且没有赋任何值给 package.loaded[modname],然后require赋true给这个成员。任何时候,require返回 package.loaded[modname]的最终值。
如果在加载或运行这个模块的时候发生任何错误,或找不到这个模块的任何加载器,那么require就会发出一个error。
package.loaded
被require使用的一个table,其模块已经被加载。当你require一个模块modname,并且package.loaded[modname]不是false,require简单返回在那里存储的值。
package.loaders
被require使用的一个table控制如何加载模块。
这个table中每个成员是一个搜索函数。当查询一个模块,require用模块名(require给定的参数)作为单独参数,按从到大顺序调用这些搜索器。这个函数可能返回另一个函数或一个字符串(解释为什么没有找到哪个模块,如果什么也不说就是nil)。
当在模拟器中运行时,搜索器查询可以用做lua库的lua文件。这些lua文件必须在你的main.lua文件同一目录下。一旦他们在你的main.lua文件的同一目录下,他们将被打包到你的设备版本中。
package.seeall (module)
用它全局环境的__index字段来为模块设置元表,以便这个模块从全局环境继承变量。为了用于函数模块的一个选项。