Corona中文站

强大、易学的跨平台(iOS/Android)开发框架。QQ群1:74390406(满) 群2:221929599

导航

五分钟学会Corona(二十八) - 模块和包
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字段来为模块设置元表,以便这个模块从全局环境继承变量。为了用于函数模块的一个选项。
<< 五分钟学会Corona(二十七) - 性能和优化五分钟学会Corona(二十九) - 内存管理改进 >>

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最近发表

Powered By Z-Blog 1.8 Walle Build 100427 Copyright 2011-2015 BuildApp.Net. All Rights Reserved.