LUA Learning Note 6: 元表与元方法

--元表:是用来存放无方法的一个table.

--table和userdata可以各种拥有独立的元表。
但是,其他类型的值就只能共享其类型所属的元表,比如,数字,所有的数字都共用一个元表。

--元方法:用来进行table 类型变量进行特殊操作的一个方法。

--Lua其实已经规定好了各种算术操作符的元方法名字:_add,_sub,_mul,_div,_unm,_mod,_pow.

--使用步骤:

    -- 创建一个元表
    local mt = {};
    mt.__add = function(t1, t2)--添加元方法。
        print("两个table相加的结果就是...神经病啊!table有什么好相加的啊!");
    end
    local t1 = {};
    local t2 = {};
    -- 给两个table设置新的元表
    setmetatable(t1, mt);
    setmetatable(t2, mt);
    -- 进行加法操作
    local result = t1 + t2;

--a.创建一个新的table变量时,它是不存在元表的(可以用getmetatable函数获取某个对象的元表,就能知道这个对象有没有元表存在了)。

--b.在Lua中,只能设置table的元表,其他类型的值的元表,只能通过C代码来完成。

--自定义元方法:

    -- 创建一个元表
    local mt = {};
    mt.__add = function(s1, s2)
        local result = "";
        if s1.sex == "boy" and s2.sex == "girl" then
            result = "完美的家庭。";
        elseif s1.sex == "girl" and s2.sex == "girl" then
            result = "哦呵呵";
        else
            result = "蛇精病"
        end
        return result;
    end

    -- 创建两个table,可以想象成是两个类的对象
    local s1 = {
        name = "Hello",
        sex = "boy",
    };  
    local s2 = {
        name = "Good",
        sex = "girl",
    }; 
    -- 给两个table设置新的元表
    setmetatable(s1, mt);
    setmetatable(s2, mt);
    -- 进行加法操作
    local result = s1 + s2;
    print(result);

[LUA-print] 完美的家庭。


你可能感兴趣的:(LUA Learning Note 6: 元表与元方法)