function createCountdownTimer(second) local ms=second * 1000; local function countDown() ms = ms - 1; return ms; end return countDown; end timer1 = createCountdownTimer(1); for i=1,3 do print(timer1()); end print("------------"); timer2 = createCountdownTimer(1); for i=0,2 do print(timer2()); end
999 998 997 ------------ 999 998 997Upvalue:一个函数所使用的定义在它的函数体之外的局部变量(external localvariable)称为这个函数的upvalue。
function create(name,id) local data={name = name,id=id}; local obj={}; function obj.GetName() return data.name; end function obj.GetID() return data.id; end function obj.SetName(name) data.name=name; end function obj.SetID(id) data.id=id end return obj; end o1 = create("Sam", 001) o2 = create("Bob", 007) o1.SetID(100) print("o1‘s id:", o1.GetID(), "o2‘s id:",o2.GetID()) o2.SetName("Lucy") print("o1‘s name:", o1.GetName(),"o2‘s name:", o2.GetName()) --o1‘s id: 100 o2‘s id: 7 --o1‘s name: Sam o2‘s name: Lucy实现方式:把需要隐藏的成员放在一张表里,把该表作为成员函数的upvalue。
t = {} m = { a = " and ", b = "Li Lei", c = "Han Meimei" } setmetatable(t, { __index = m}) --表{ __index=m }作为表t的元表 for k, v in pairs(t) do --穷举表t print(v) end print("-------------") print(t.b, t.a, t.c) --输出结果 --------------- --Li Lei and Han Meimei function add(t1, t2) --‘#’运算符取表长度 assert(#t1 == #t2) local length = #t1 for i = 1, length do t1[i] = t1[i] + t2[i] end return t1 end --setmetatable返回被设置的表 t1 = setmetatable({ 1, 2, 3}, { __add = add }) t2 = setmetatable({ 10, 20, 30 }, {__add = add }) t1 = t1 + t2 for i = 1, #t1 do print(t1[i]) end --11 --22 --33定义:元表本身只是一个普通的表,通过特定的方法(比如setmetatable)设置到某个对象上,进而影响这个对象的行为;一个对象有哪些行为受到元表影响以及这些行为按照何种方式受到影响是受Lua语言约束的。比如在前面的代码里,两个表对象的加法运算,如果没有元表的干预,就是一种错误;但是Lua规定了元表可以“重载”对象的加法运算符,因此若把定义了加法运算的元表设置到那两个表上,它们就可以做加法了。元表是Lua最关键的概念之一,内容也很丰富,请参考Lua文档了解详情。
Lua进阶(一)——函数闭包、元表,码迷,mamicode.com
原文地址:http://blog.csdn.net/shimazhuge/article/details/24841143