functionreverse(s,t) if #s<1then return t end first=string.sub(s,1,1) --string.sub(字符串,起始位置,终止位置) 可以负数 rest=string.sub(s,2,-1) returnreverse(rest,first..t) end large=string.rep('hello',5000) print(reverse(large,''))
函数多返回值
多的忽略,少的默认nil。
1 2 3 4
functionweapons() return'a','b' end w1,w2=weapons()
具名参数
1 2 3 4
functionf(table) print('xxx'..table.medium) end function(small=5.00,medium=7.00,jumbo=15.00)
控制流程
if语句
1 2 3 4
if file=='a'then --... elseif file=='b'then --...
for循环
1 2 3 4 5 6 7
for i=1,5do print(i) end
for i=1,5,2do print(i) end
while循环
1 2 3
whilemath.random(100)<50do --... end
局部变量
1 2 3 4 5
functionf(a,b) local a2=a*a local b2=b*b returnmath.sqrt(a2+b2) end
functionprint_table(t) for k,v inpairs(t) do--pairs迭代器 直到返回nil print(k..":"..v) end end
字典(shu zu
1 2 3 4 5 6 7 8 9 10
--创建数据 medals={ "a", "b", "c" }
--读写 =medals[1] medals[4]="lead"
风格混用
1 2 3 4 5 6 7
ice={ "a", "b"; c=true } =ice[1] =ice.c
将文件加载到REPL
1
dofile('*.lua')
或启动时:
1
lua -l *
metatable
元表基础
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
greek={ t1="a", t2="b", t3="c" } functiontable_to_string(t) local result={} for k,v inpairs(t) do result[#result+1]=k..":"..v end returntable.concat(result,"\n") end mt={ __tostring=table_to_string --重写__tostring函数 } setmetatable(greek,mt) =greek
local _private={} functionstrict_read(table,key) if _private[key] then return _private[key] else error("xxx"..key) --不存在 end end functionstrict_write(table,key,value) if _private[key] then error("xxx"..key) --已存在 else _private[key]=value end end local mt={ __index=strict_read, __newindex=strict_write } treasure={} setmetatable(treasure,mt)
面向对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Villain={ health=100, new=function(self,name) local obj={ name=name, health=self.health, } --以下两行保证take_hit函数成员仍属于Villain对象 setmetatable(obj,self) self.__index=self return obj end, take_hit=function(self) self.health=self.health-10 end } dietrich=Villain.new(Villain,"Dietrich")
Villain={ health=100 } functionVillain:new(name) --可以直接使用self end functionVillain:take_hit() --可以直接使用self end SuperVillain=Villain:new() functionSuperVillain:take_hit() --可以直接使用self end
functionfibonacci() local m=1 local n=1 whiletruedo coroutine.yield(m) --暂停协程并返回 m,n=n,m+n end end generator=coroutine.create(fibonacci) succeeded,value=coroutine.resume(generator) --转到fibonacci =value --1 succeeded,value=coroutine.resume(generator) --继续fibonacci =value --2
local pending={} localfunctionschedule(time,action) pending[#pending+1]={ time=time, action=action } sort_by_time(pending) end localfunctionsort_by_time(array) table.sort(array,function(e1,e2)return e1.time<e2.timeend) end localfunctionwait(seconds) coroutine.yield(seconds) end localfunctionrun() while #pending>0do whileos.clock()<pending[1].timedo end local item=remove_first(pending) local _,seconds=coroutine.resume(item.action) if seconds then later=os.clock()+seconds schedule(later,item.action) end end end localfunctionremove_first(array) result=array[1] array[1]=array[#array] array[#array]=nil return result end return{ schedule=schedule, run=run, wait=wait }
使用方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
scheduler=require'scheduler' --require()对比dofile():检查是否加载过、搜索多个程序库加载路径、给局部变量提供安全的命名空间 functionpunch() for i=1,5do print('punch '..i) scheduler.wait(1.0) end end functionblock() for i=1,3do print('block '..i) scheduler.wait(2.0) end end scheduler.schedule(0.0,coroutine.create(punch)) scheduler.schedule(0.0,coroutine.create(block)) scheduler.run()