Lua编程示例(二))面向对象、metatable对表进行扩展的教程
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]: ?
本文地址:http://www.45fan.com/bcdm/15709.html