Lua知识点_基础_module



1.概述
Lua的module(模块)可以理解为是一个table,这个table里有一些变量、一些函数。
与Java、C++等面向对象语言的类很像,可以简单地把模块理解为类。


2.实例1
src--
--main.lua
--game.lua


(1)创建一个最简单的模块脚本
game.lua---------------
game = {}
function game.play()
    print("那么,开始吧");
end
function game.quit()
    print("你走吧,我保证你不会出事的,呵,呵呵");
end
return game;


(2)用require加载模块脚本
main.lua---------------
local function main()
    cc.FileUtils:getInstance():addSearchPath("src")
    game = require("game");
   
    game.play();
end


注意:我们要require其他文件的时候,要把文件路径给设置好,否则会找不到文件。
这里使用的是Cocos Code IDE,直接调用addSearchPath函数就可以了。


(3)运行代码,结果如下:
[LUA-print] 那么,开始吧


3.实例2
(1)
在上面的实例1中,我们实现了一个简单的模块,但有时,我们需要修改模块的名字,
按照实例1中的情况,必须修改每个函数的名字,但有很多函数时,很容易出错,于是
我们修改实例1如下:
game.lua---------------
local M = {};
--“...”就是传递给模块的模块名,在这里其实就是“game”这个字符串。
local modelName = ...;
_G[modelName] = M;
--保存需要使用到的全局模块(print函数是保存在_G表中的)
local print = print;
--设置非全局的环境为M,此脚本中所有函数都从M中查找
setfenv(1, M);
function play()
    print("那么,开始吧");
end
function quit()
    print("你走吧,我保证你不会出事的,呵,呵呵");
end
return M;


注意:上面的play()、quit()已经不需要前缀了,因为我们设置了非全局的环境为M。
  另外,这样做的好处是不需要担心重新定义了已存在的函数名,因为外部的全局
变量与这里无关了。


(2)
以上在(1)的脚本中的代码还是有点麻烦,Lua提供了module函数帮我们处理了,如下
game.lua---------------
module(..., package.seeall);
function play()
    print("那么,开始吧");
end
function quit()
    print("你走吧,我保证你不会出事的,呵,呵呵");
end


注意:
package.seeall参数的作用就是让原来的_G依然生效,相当于调用了:
setmetatable(M, {__index = _G});
再次留意一下,代码末尾的return M也不见了,因为module函数的存在,已经不需要
我们主动去返回这个模块的table了。


4.如何调用模块
在cocos2dx lua中全都在frameworks/runtime-src/Classes/lua_module_register.h中。













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值