lua文件函数调用

lua脚本是面向过程的语言,一般文件结构:

Data.lua

local _iData = 0
local _arrData = {}

--local表示局部变量或函数 只要没有local声明就是全局的
--iOpen是全局变量
--OptData是私有函数
local function OptData()
    iOpen = 10
    _iData = _iData + iOpen
end

function OptArrData(key, value)
    _arrData[key] = value
end

function Trace()
    --因为是面向过程 所以 OptData 函数需要写在调用者 Trace 之前
    OptData()
    OptArrData(1, 10)
    print(_arrData[1], _iData)
end

然后我们希望在其他文件中调用Data.lua

一、模块方式

首先我们要了解 require 和 module 的作用
module :定义一个模块 (做了很多操作 建议自行百度)
require :查询并导入模块

所以我们的 Data.lua 文件将稍作调整
我们定义Data.lua 在工作目录下 ./data/Data.lua

--在文件的头部添加 module 定义一个不重复的模块名 一般使用文件路径
module("data.Data",package.seeall)

local _iData = 0
local _arrData = {}

省略......

定义好模块之后 我们在 Test.lua 中调用

Test.lua

function Test()
    --导入包
    require("data.Data")
    --用包调用函数
    data.Data:Trace()
    --输出:10 11
end

值得注意的也可以选择 . 调用
区别在于 . 调用的第一个参数会讲自身作为table传递进去 当调用的是带参数的函数时尤其注意

Test.lua

function Test()
    --导入包
    require "data.Data"
    --用包调用函数
    data.Data:OptArrData(1, 10)
    --相当于 _arrData[1] = 10
    data.Data.OptArrData(1, 20)
    --这里却是 第一个参数接收的是 Data.lua 自身的表 
    --相当于 _arrData[Data] = 1 结果可想而知
end

一、表结构方式

因为lua最主要的结构是 Table 也为了避免面向结构带来的优先级困扰所以可以直接将一个lua文件就作为一个表来调用

注意变化
Data.lua

--声明一张表 
local Data = {}

local _iData = 0
local _arrData = {}

--这个时候即使调用者在被调用者之前声明也没关系 因为表数据被完全读取
function Data:Trace()
    OptData()
    OptArrData(1, 10)
    print(_arrData[1], _iData)
end

--将函数作为表键值存下来 这时候不能再使用 local 描述符
function Data:OptData()
    iOpen = 10
    _iData = _iData + iOpen
end

function Data:OptArrData(key, value)
    _arrData[key] = value
end


--注意最后将表返回回去
return Data

调用:
Test.lua

function Test()
    --直接拿到对象 然后调用函数
    local oData = require("data.Data")
    oData:Trace()
    --输出:10 11
end

用这种方式将可以实现 面向对象的类操作 以后接着聊


版权声明:本文为layoliu原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。