• Lua入门(二)


    元表

    修改表的操作符行为

    通过重载 "__add" 元方法来计算集合的并集实例:

    local set1 = {10, 20, 30}   -- 集合
    local set2 = {20, 40, 50}   -- 集合
    
    -- 将用于重载__add的函数,注意第一个参数是self
    local union = function (self, another)
        local set = {}
        local result = {}
    
        -- 利用数组来确保集合的互异性
        for i, j in pairs(self) do set[j] = true end
        for i, j in pairs(another) do set[j] = true end
    
        -- 加入结果集合
        for i, j in pairs(set) do table.insert(result, i) end
        return result
    end
    setmetatable(set1, {__add = union}) -- 重载 set1 表的 __add 元方法
    
    local set3 = set1 + set2
    for _, j in pairs(set3) do
        io.write(j.." ")               -->output:30 50 20 40 10
    end
    

    除了加法可以被重载之外,Lua 提供的所有操作符都可以被重载:

    元方法 含义
    "__add" + 操作
    "__sub" - 操作 其行为类似于 "add" 操作
    "__mul" * 操作 其行为类似于 "add" 操作
    "__div" / 操作 其行为类似于 "add" 操作
    "__mod" % 操作 其行为类似于 "add" 操作
    "__pow" ^ (幂)操作 其行为类似于 "add" 操作
    "__unm" 一元 - 操作
    "__concat" .. (字符串连接)操作
    "__len" # 操作
    "__eq" == 操作 函数 getcomphandler 定义了 Lua 怎样选择一个处理器来作比较操作 仅在两个对象类型相同且有对应操作相同的元方法时才起效
    "__lt" < 操作
    "__le" <= 操作

    除了操作符之外,如下元方法也可以被重载,下面会依次解释使用方法:

    元方法 含义
    "__index" 取下标操作用于访问 table[key]
    "__newindex" 赋值给指定下标 table[key] = value
    "__tostring" 转换成字符串
    "__call" 当 Lua 调用一个值时调用
    "__mode" 用于弱表(week table)
    "__metatable" 用于保护metatable不被访问
    mytable = setmetatable({key1 = "value1"},   --原始表
      {__index = function(self, key)            --重载函数
        if key == "key2" then
          return "metatablevalue"
        end
      end
    })
    print(mytable.key1,mytable.key2)  --> output:value1 metatablevalue
    
    
    t = setmetatable({[1] = "hello"}, {__index = {[2] = "world"}})
    print(t[1], t[2])   -->hello world
    
    
    arr = {1, 2, 3, 4}
    arr = setmetatable(arr, {__tostring = function (self)
        local result = '{'
        local sep = ''
        for _, i in pairs(self) do
            result = result ..sep .. i
            sep = ', '
        end
        result = result .. '}'
        return result
    end})
    print(arr)  --> {1, 2, 3, 4}
    
    
    functor = {}
    function func1(self, arg)
      print ("called from", arg)
    end
    setmetatable(functor, {__call = func1})
    functor("functor")  --> called from functor
    print(functor)      --> output:0x00076fc8 (后面这串数字可能不一样)
    
    
    Object = setmetatable({}, {__metatable = "You cannot access here"})
    
    print(getmetatable(Object)) --> You cannot access here
    setmetatable(Object, {})    --> 引发编译器报错
    

    面向对象编程

    ---------- s_base.lua
    local _M = {}
    
    local mt = { __index = _M }
    
    function _M.upper (s)
        return string.upper(s)
    end
    
    return _M
    
    ---------- s_more.lua
    local s_base = require("s_base")
    
    local _M = {}
    _M = setmetatable(_M, { __index = s_base })
    
    
    function _M.lower (s)
        return string.lower(s)
    end
    
    return _M
    
    ---------- test.lua
    local s_more = require("s_more")
    
    print(s_more.upper("Hello"))   -- output: HELLO
    print(s_more.lower("Hello"))   -- output: hello
    

    成员私有性

    function newAccount (initialBalance)
        local self = {balance = initialBalance}
        local withdraw = function (v)
            self.balance = self.balance - v
        end
        local deposit = function (v)
            self.balance = self.balance + v
        end
        local getBalance = function () return self.balance end
        return {
            withdraw = withdraw,
            deposit = deposit,
            getBalance = getBalance
        }
    end
    
    a = newAccount(100)
    a.deposit(100)
    print(a.getBalance()) --> 200
    print(a.balance)      --> nil
    
  • 相关阅读:
    多线程按序打印1-100
    负载均衡算法
    day05_05 for循环、break语句
    day05_04 数据类型-数值、布尔值、字符串简介
    day05_03 字符串格式化
    day05_02 IDE介绍及设置
    小甲鱼零基础入门PYTHON
    day01_14.遍历数组
    day01_13.数组
    day01_11.break和continue
  • 原文地址:https://www.cnblogs.com/7fancier/p/9796748.html
Copyright © 2020-2023  润新知