Lua学习笔记(五)

Lua模块与包

模块类似于一个封装库

创建方法:

  • 创建一个table
  • 把需要导出的常量、函数放入其中
  • 返回该table
-- 文件名为mymodule.lua
-- 定义一个名为mymodule的模块
mymodule={}

-- 定义一个常量
mymodule.constant="这是一个常量"

-- 定义一个函数
function mymodule.func1()
    io.write("这是一个公有函数!\n")
end

local function func2()
    print("这是一个私有函数!")
end

function module.func3()
    func2()
end

return mymodule

require函数

-- require函数用于加载模块,使用方法:
require("mymodule")
require "mymodule"

-- 执行require后返回由模块常量或函数组成的table,并且还会定义一个包含该table的全局变量
require("mymodule")
print(module.constant)
mymodule.func3()

-- 也可以创建别名
local m=require("mymodule")
print(m.constant)
m.func3()

加载机制:

https://www.runoob.com/lua/lua-modules-packages.html

Metatable(元表)

元表允许改变table的行为,每个行为关联了对应的元方法

--[[
作用:对指定的table设置metatable
参数列表:
    table:操作对象
    metatable:元表
返回值:绑定好对象的table
]]
setmetatable(table,metatable)

--[[
作用:返回对象的元表
参数列表:
    table:操作对象
返回值:元表
]]
getmetatable(table)

__index元方法

-- 当使用table中的某个键key时,会查找table中的该键key,如果没有这个键key则会寻找该table的metatable中的_index键,如果__index包含一个table,Lua会在表格中查找键值为key的元素
other={foo=3}
t=setmetatable({},{_index=other})   -- t中没有foo键,调用foo是在metatable中查找__index对应的table,再在该table上查找foo键
t.foo       -- 输出:3

-- __index 元方法查看表中元素是否存在,如果不存在,返回结果为 nil;如果存在则由 __index 返回结果。如果__index包含一个函数,Lua就会调用该函数,table和键作为参数传递给函数。
mytable=setmetatable({key1="value1"},{
        __index=function(mytable,key)
            if key == "key2" then
                return "metatablevalue"
            else
                return nil
            end
        end
    })

print(mytable.key1,mytable.key2)
--[[
输出结果:
value1  metatablevalue
]]
Lua查找table元素规则:
  1. 在表中查找,如果找到,返回该元素,找不到则继续

  2. 判断该表是否有元表,如果没有元表,返回 nil,有元表则继续

  3. 判断元表有没有__index方法,如果__index方法为nil,返回nil;如果__index方法是一个表,则重复1、2、3;如果__index方法是一个函数,则返回该函数的返回值

__newindex元方法

-- __newindex方法用于对表更新,__index则用来对表访问
-- 给表的一个缺少的索引赋值,解释器就会查找__newindex 元方法:如果存在则调用这个函数而不进行赋值操作
mymetatable={}
mytable=setmetatable({key1="value1"},{__newindex=mymetatable})
print(mytable.key1)
mytable.newkey="新值2"
print(mytable.newkey,mymetatable.newkey)
mytable.key1 = "新值1"
print(mytable.key1,mymetatable.key1)
--[[
输出结果:
value1
nil 新值2
新值1 nil
]]

-- 如果__newindex元方法是一个函数,则会把该table,该key,该value作为参数传进函数
mytable = setmetatable({key1 = "value1"}, {
    __newindex = function(mytable, key, value)
        rawset(mytable, key, "\""..value.."\"")
    end
})
mytable.key1 = "new value"
mytable.key2 = 4
print(mytable.key1,mytable.key2)
--[[
输出结果:
new value   "4"
]]

为表添加操作符(类似于运算符重载)

元方法对应运算符
__add+
__sub-(减号)
__mul*
__div/
__mod%
_unm-(负号)
__concat..
__eq==
__lt<
__le<=

__call元方法

-- __call元方法在该表被当成函数来调用时会调用
mytable=setmetatable({10},{
        __call=function(mytable,newtable)
            local sum=0
            for i=1,#mytable do
                sum=sum+mytable[i]
            end
            for i=1,#newtable do
                sum=sum+newtable[i]
            end
            return sum
        end
    })
newtable={10,20,30}
print(mytable(newtable))    -- 输出结果:70

__tostring元方法

-- __tostring 元方法用于修改表的输出行为
mytable = setmetatable({ 10, 20, 30 }, {
    __tostring = function(mytable)
        local sum = 0
        for k, v in pairs(mytable) do
            sum = sum + v
         end
        return "表所有元素的和为 " .. sum
    end
})
print(mytable)  -- 输出结果:表所有元素的和为 60

转载于:https://www.cnblogs.com/JaxesZ/p/11217021.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值