当前位置 博文首页 > Lua编程示例(二):面向对象、metatable对表进行扩展

    Lua编程示例(二):面向对象、metatable对表进行扩展

    作者:admin 时间:2021-02-03 21:00

    counter = {
     count = 0
    }
    function counter.get(self)
     return self.count
    end
    
    function counter:inc()
     self.count=self.count+1
    end
    
    print(counter.get(counter))
    counter.inc(counter)
    print(counter.get(counter))
    
    counter2={
     count=4,
     get = counter.get,
     inc = counter.inc,
    }
    
    print(counter2:get())
    counter.inc(counter2)
    print(counter2.get(counter2))
    
    print()
    
    tb1 ={ "alpha","beta","gamma"}
    mt={}
    setmetatable(tb1,mt)
    
    print(getmetatable(tb1) == mt)
    
    print()
    
    function mt.__add(a,b)
     local result = setmetatable({},mt)
     for i=1,#a do
     table.insert(result,a[i])
     end
     for i=1,#b do
     table.insert(result,b[i])
     end
     return result
    end
    
    tb2={"aaa","bbb","ccc"}
    res=tb1+tb2
    for i,v in ipairs(res) do
     print(v)
    end
    print()
    function mt.__unm(a)
     local result = setmetatable({},mt)
     for i=#a , 1 ,-1 do
     table.insert(result,a[i])
     end
     return result
    end
    
    res=-tb1+tb2
    for i,v in ipairs(res) do
     print(v)
    end
    
    print()
    function mt.__tostring(a)
     local result = "{"
     for i,v in ipairs(a) do
     result = result.." "..v
     end
     result = result.." } "
     return result
    end
    
    print(tb1)
    
    function mt.__index(tb1,key)
     print("there is no "..key.." in the table")
     return nil
    end
    
    print(tb1["fsy"])
    
    function mt.__newindex(a,key,v)
     if( key == "haha") then
     error(" Stop laugh!",2)
     else
     rawset(a,key,v)
     end
    end
    
    tb1.haha="heihei"
    

     
    运行结果:

    0
    1
    4
    5
    
    true
    
    alpha
    beta
    gamma
    aaa
    bbb
    ccc
    
    gamma
    beta
    alpha
    aaa
    bbb
    ccc
    
    { alpha beta gamma } 
    there is no fsy in the table
    nil
    lua: my_test.lua:166: Stop laugh!
    stack traceback:
     [C]: in function 'error'
     my_test.lua:160: in function <my_test.lua:158>
     my_test.lua:166: in main chunk
     [C]: ?
    

     

    js