require是Lua自带的函数,require("test")有2个作用:
1.执行文件test.lua中直接调用的语句,多次调用require一个文件只会执行一次
2.加载test.lua中的表,变量,函数等定义的东西
要注意的是require查找文件的路径,其保存在package.path中,这种路径是"模板式的路径",它里面会包含可替代符号"?",这个符号会被替换,然后lua查找这个文件是否存在.可以通过print(package.path)查看路径,例如我print的路径信息为:
.\?.lua;
D:\QuickRoot\Quick0\frameworks\runtime-src\proj.win32\Debug.win32\lua\?.lua;
D:\QuickRoot\Quick0\frameworks\runtime-src\proj.win32\Debug.win32\lua\?\init.lua;
src\
路径中的问号会被替换为文件或文件夹名,例如require("a.b")时,.会被翻译为目录分隔符\ ; 查找文件为:
.\a\b.lua;
D:\QuickRoot\Quick0\frameworks\runtime-src\proj.win32\Debug.win32\lua\a\b.lua;
D:\QuickRoot\Quick0\frameworks\runtime-src\proj.win32\Debug.win32\lua\a\b\init.lua;
src\a\b.lua
因此使用require时并不会在本文件所在同级目录查找,quick中main.lua里有这么一句:package.path = package.path .. ";src/" 因此可以使用这样字符串追加的方式增加新的查找路径
import是quick-cocos2d-x框架中的函数,定义在functions.lua中,其内部实现最终也是调用require,和require相比import加载文件后的效果相同,支持在package.path路径中搜索; 区别是import支持同级目录和上级目录搜索,同级目录搜索加一个点:import(".test"),上级目录搜索加2个点:import("..test"),依次类推.
不过 import() 只有在模块级别调用(也就是没有将 import() 写在任何函数中)时,才能够自动得到当前模块名。如果需要在函数中调用 import(),那么就需要指定当前模块名:
local CURRENT_MODULE_NAME = ...
self.sprite:addNodeEventListener(cc.NODE_TOUCH_EVENT, function(event)
import("..test", CURRENT_MODULE_NAME)
return false
end)