学习完了函数,那么,一堆函数就成了一个模块,一堆模块就是一个包。今天来学习一下怎么写一个模块和怎么调用模块。
一.简介
--加载另一个模块
require "mod"
--调用另一个模块中的func函数
mod.func()当然,还可以把模块设置成一个较短的名称,供局部使用,或者设置模块中的某个函数为较短的名称:--设置模块的局部名称
local m = require "mod"
--设置模块函数局部名称
local f = m.func
--使用
m.func()
--或者
f()二.关于全局变量
--定义一个全局变量
a = 100;
--自己定义全局函数
function testfunc()
print("hehe")
end
--输出Lua中的全局变量
for n in pairs(_G) do
print(n)
end结果:load
package
require
coroutine
select
pairs
rawlen
tonumber
assert
type
os
io
math
debug
next
setmetatable
error
rawset
tostring
dofile
_VERSION
getmetatable
table
rawequal
string
rawget
_G
testfunc
pcall
utf8
xpcall
loadfile
a
collectgarbage
请按任意键继续. . .
三.编写一个简单的模块
--定义一个模块
--模块名
func = {}
--模块内部的内容加上模块名
function func.test1()
print("test1 func!")
end
function func.test2()
print("test2 func!")
end
func.num = 10
--最后需要将模块名返回
return func 这样,一个最简单的模块就编写好了,我们使用的时候,只需要加载这个模块就可以了。但是,这个模块的设计有很多很多缺陷,不过作为测试暂时够了,先看看怎么使用这个模块。四.使用一个模块
关于require的详细操作:
function require (name)
if not package.loaded[name] then<span style="white-space:pre"> </span>--判断模块是否已经加载了,避免重复加载
local loader = findload(name)
if loader == nil then
error("unable to load module " .. name)
end
package.loaded[name] = true --避免递归加载时死循环。
local res = loader(name)<span style="white-space:pre"> </span>--初始化模块
if res ~= nil then
package.loaded[name] = res
end
end
return package.loaded[name]
end
分析一下上面的操作:使用一下上面编写好的模块:
--定义一个模块
--模块名
func = {}
--模块内部的内容加上模块名
function func.test1()
print("test1 func!")
end
function func.test2()
print("test2 func!")
end
func.num = 10
--最后需要将模块名返回
return func 测试文件test.lua:local m = require "func"
--使用模块中的内容
m.test1()
m.test2()
print(m.num)
print("\n")
--再看一下全局变量的情况
for n in pairs(_G) do
print(n)
end结果:test2 func!
10
setmetatable
rawget
next
tostring
getmetatable
load
rawset
pairs
pcall
os
coroutine
xpcall
dofile
select
type
table
tonumber
func
error
debug
utf8
math
ipairs
loadfile
rawlen
string
collectgarbage
_VERSION
rawequal
io
package
require
_G
assert
请按任意键继续. . .
关于模块路径的问题:
?;?.lua;c:\windows\?;/usr/local/lua/?/?.lua那么,lua就会尝试加载下面的内容:mod
mod.lua
c:\windows\mod
/usr/local/lua/mod/mod.lua
--输出Lua默认的加载搜寻路径
print("Lua:", package.path)
--输出C默认的加载搜寻路径
print("C:",package.cpath)p\LuaTest\Lua Scrip\?.lua;C:\Users\puppet_master\Desktop\LuaTest\Lua Scrip\?\ini
t.lua;C:\Users\puppet_master\Desktop\LuaTest\Lua Scrip\..\share\lua\5.3\?.lua;C:
\Users\puppet_masterDesktop\LuaTest\Lua Scrip\..\share\lua\5.3\?\init.lua;.\?.l
ua;.\?\init.lua
C: C:\Users\puppet_master\Desktop\LuaTest\Lua Scrip\?.dll;C:\Users\puppet_master\Desktop\LuaTest\Lua Scrip\..\lib\lua\5.3\?.dll;C:\Users\puppet_master\Desk
top\LuaTest\Lua Scrip\loadall.dll;.\?.dll
请按任意键继续. . .
#define LUA_PATH_DEFAULT \
LUA_LDIR"?.lua;" LUA_LDIR"?\\init.lua;" \
LUA_CDIR"?.lua;" LUA_CDIR"?\\init.lua;" \
LUA_SHRDIR"?.lua;" LUA_SHRDIR"?\\init.lua;" \
".\\?.lua;" ".\\?\\init.lua"
#define LUA_CPATH_DEFAULT \
LUA_CDIR"?.dll;" \
LUA_CDIR"..\\lib\\lua\\" LUA_VDIR "\\?.dll;" \
LUA_CDIR"loadall.dll;" ".\\?.dll"如果想要进行修改就可以改啦。五.编写一个真正的模块
为了方便修改模块名称:
--定义一个模块
--本地模块名
local M = {}
--真正的模块名
func = M
--模块内部的内容加上模块名
function M.test1()
print("test1 func!")
end
function M.test2()
print("test2 func!")
end
M.num = 10
--最后需要将模块名返回
return func 这种方法就是用了一个本地的,简单的变量,操作本地的内容,将内容都创建好了,把这个table的引用再给真正的全局引用,然后返回真正的模块名即可。如果模块名和模块所在的文件不同名时,会发生什么?
--定义一个模块
--本地模块名
local M = {}
--真正的模块名
mod = M
--模块内部的内容加上模块名
function M.test1()
print("test1 func!")
end
function M.test2()
print("test2 func!")
end
M.num = 10
--最后需要将模块名返回
return mod --require 必须跟模块文件名,直接给模块名找不到的
--这里的文件名不考虑后缀的问题,lua会自动补全后缀
require "func"
for n in pairs(_G) do
print(n)
end结果:collectgarbage
utf8
require
next
select
package
rawset
error
ipairs
tostring
getmetatable
rawequal
type
dofile
table
os
coroutine
string
setmetatable
load
pairs
rawlen
mod
_G
debug
loadfile
pcall
io
assert
tonumber
math
_VERSION
rawget
请按任意键继续. . .
通过改文件名改模块名:
--定义一个模块
--由于require函数会将需要的模块名传递给该函数,所以...就代表了模块名
local modname = ...
--本地模块名
local M = {}
--真正的模块名直接祖册到全局变量中
_G[modname] = M
--模块内部的内容加上模块名
function M.test1()
print("test1 func!")
end
function M.test2()
print("test2 func!")
end
M.num = 10
这样,require这个模块的时候,模块名会传递给...,这个就作为模块名,就是文件名。所以,我们就不需要自己定义文件名了。
1万+



被折叠的 条评论
为什么被折叠?



