zoukankan      html  css  js  c++  java
  • [Lua快速了解一下]Lua的MetaTable和MetaMethod

    MetaTable和MetaMethod是Lua中的重要的语法,MetaTable主要是用来做一些类似于C++重载操作符式的功能。

    两个分数

    fraction_a = {numerator=2, denominator=3}
    fraction_b = {numerator=4, denominator=7}

    我们想实现分数间的相加:2/3 + 4/7,我们如果要执行: fraction_a + fraction_b,会报错的。

    所以,我们可以动用MetaTable,如下所示:

    fraction_op={}
    function fraction_op.__add(f1, f2)
        ret = {}
        ret.numerator = f1.numerator * f2.denominator + f2.numerator * f1.denominator
        ret.denominator = f1.denominator * f2.denominator
        return ret
    end

    然后为之前定义的两个table设置MetaTable:(其中的setmetatble是库函数)

    setmetatable(fraction_a, fraction_op)
    setmetatable(fraction_b, fraction_op)

    于是你就可以这样干了:(调用的是fraction_op.__add()函数)

    fraction_s = fraction_a + fraction_b

    至于__add这是MetaMethod,这是Lua内建约定的,其它的还有如下的MetaMethod:

    __add(a, b)                     对应表达式 a + b
    __sub(a, b)                     对应表达式 a - b
    __mul(a, b)                     对应表达式 a * b
    __div(a, b)                     对应表达式 a / b
    __mod(a, b)                     对应表达式 a % b
    __pow(a, b)                     对应表达式 a ^ b
    __unm(a)                        对应表达式 -a
    __concat(a, b)                  对应表达式 a .. b
    __len(a)                        对应表达式 #a
    __eq(a, b)                      对应表达式 a == b
    __lt(a, b)                      对应表达式 a < b
    __le(a, b)                      对应表达式 a <= b
    __index(a, b)                   对应表达式 a.b
    __newindex(a, b, c)             对应表达式 a.b = c
    __call(a, ...)                  对应表达式 a(...)
  • 相关阅读:
    permute
    ind2sub
    randi( )函数--MATLAB
    ABAQUS复合材料
    matlab中fix函数,floor函数,ceil函数
    在windows10中卸载软件和取消开机启动程序
    在linux的tomcat中配置https及自动跳转
    解决ubuntu无法远程连接
    谷歌浏览器 插件安装配置Momentum chrome
    0903——元类
  • 原文地址:https://www.cnblogs.com/otakuhan/p/8606456.html
Copyright © 2011-2022 走看看