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]: ?
(0)

相关推荐

  • Lua编程示例(一):select、debug、可变参数、table操作、error

    function test_print(...) for i=1,select("#",...) do print(i,select(i,...)) end end test_print(11,12,13,14) print() print(debug.traceback()) print() function test(...) for i=1,arg.n do print(i.."\t"..arg[i]) end end test("a",2

  • 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 = coun

  • Lua编程示例(八):生产者-消费者问题

    这个问题是比较经典的啦,基本所有语言的多线程都会涉及到,但是没想到Lua的这个这么复杂 抓狂   看了好长时间才算看明白,先上个逻辑图: 开始时调用消费者,当消费者需要值时,再调用生产者生产值,生产者生产值后停止,直到消费者再次请求.设计为消费者驱动的设计.    图画的不太好,可以先将Filter遮住,它是过滤器对两个程序之间传递的信息进行处理.去掉Filter逻辑就更清晰些了,就是两个"线程"(其实是两个协同程序)互相调用.resume回到yield处开始,支持嵌套,返回到栈顶的y

  • Lua编程示例(六): C语言调用Lua函数

    C++端: #include "stdafx.h" lua_State *L; void load_lua(lua_State **L,char *filename){ *L=luaL_newstate(); luaL_openlibs(*L); if(luaL_loadfile(*L,filename) || lua_pcall(*L,0,0,0)){ luaL_error(*L,"load file error! %s",lua_tostring(*L,-1))

  • Lua编程示例(五): C语言对Lua表的读取和添加

    #include "stdafx.h" lua_State *L; void load_lua(char *filename){ L=luaL_newstate(); luaL_openlibs(L); if((luaL_loadfile(L,filename) || lua_pcall(L,0,0,0))!= 0){ luaL_error(L,"loadfile error! \n %s",lua_tostring(L,-1)); } } double getfi

  • Lua编程示例(四):Lua标准库之表库、字符串库、系统库

    tb1 = { "alpha","log","gamme"} print(table.concat(tb1," , ")) print(table.concat(tb1,"\n",nil,2)) print() tb1[88.99] = 'aaa' --返回索引值最大的值,并且计算小数 print(table.maxn(tb1)) print() --默认删除索引最大的元素并返回 print(table.r

  • Java并发编程示例(二):获取和设置线程信息

    Thread类包含几个属性,这些属性所表示的信息能帮助我们识别线程.观察其状态.控制其优先级等.这些线程包括如下几种: ID: 该属性表示每个线程的唯一标识: Name: 该属性存储每个线程的名称: Priority: 该属性存储每个Thread对象的优先级.线程优先级分1到10十个级别,1表示最低优先级,10表示最高优先级.并不推荐修改线程的优先级,但是如果确实有这方面的需求,也可以尝试一下. Status: 该属性存储线程的状态.线程共有六种不同的状态:新建(new).运行(runnable

  • Lua编程示例(七):协同程序基础逻辑

    co=coroutine.create(function() print("hi") end) print(coroutine.status(co)) coroutine.resume(co) print(coroutine.status(co)) print() co=coroutine.create(function() for i=1,2 do print("co",i) coroutine.yield() end end) coroutine.resume(

  • Lua编程示例(三):稀疏表、双端队列、格式化输出、表和循环表的格式化输出

    a={} for i=1,10 do a[i]={} for j=0,10 do if(i%2==0) then a[i][j]=0 end end end print(a[9][10]) print(a[10][10]) print() --双端队列 List={} function List.new() return {first = 0,last = -1} end function List.pushleft(list,value) local first= list.first-1 l

  • Python面向对象编程(二)

    目录 一.对象的继承 1.类的构造函数继承__init__(): 2.继承关系中,对象查找属性的顺序 二.类的派生 1.派生方法一(类调用) 2.派生方法二(super) 三.类的组合 四.多父类继承问题 1.新式类(MRO)列表 2.super()方法详解 五.抽象类 六.类的封装 1.私有属性:双下划线的方式__x 2.外部使用变形访问:_类名__x 3.在继承中,父类如果不想让子类覆盖自己的方法,可以将方法定义为私有的 七.类的属性(property) 1.装饰器方式 (推荐使用) 2.经

随机推荐