programming in lua 初读4,5,6,7,8

初学者,有错误希望指正。

4——————————闭包的小应用,利用闭包特性建立隔离沙箱

--[[创建一个安全的环境。当运行一段不信任的代码时需要的安全环境]]
--[[比如使用闭包重定义io库的open函数来限制程序打开的文件]]
--[[写一个调用io.open]]
function open_change(filename,mode)
  local newopen=io.open
  --[[可用可不用用local就是chunk内使用,不用local就是全局]]
  newopen=function(filename)
  if access_OK(filename,mode)then 
  return io.open(filename,mode)
  else
  return nil,"access dennied"
  --[[尾调用,尾调用不需要使用栈空间,那么尾调用递归的层次可以无限制的,不会导致栈溢出]]
    end
    --[[修改后newopen只能本地使用,全局的io.open不被修改]]
   end
end
--[[修改io.open的返回]]
function open_change(filename,mode)
  local oldopen=io.open
  io.open=function(filename)
  if access_OK(filename,mode)then 
  return oldopen(filename,mode)
  else
  return nil,"access dennied"
  --尾调用,尾调用不需要使用栈空间,那么尾调用递归的层次可以无限制的,不会导致栈溢出
    end
    --[[修改后的io.open在本文件内都被修改,如果是作为module被require那么修改后的io.open同样适用于require本文件的新文件]]
    end

end

5————迭代器与闭包
--[[迭代器支持指针类型结构,需要保留上一次成功调用的状态,和下一次成功调用的状态,知道来自哪里,和将要前往哪里,闭包能够实现]]
--[[一个典型的闭包包含两个函数:一个是闭包自己,另一个是工厂(创建闭包的函数)]]
--[[一个简单的迭代器,返回元素的值]]
function lsit_iter(t)
local i=0
local n=table.getn(t)
return function()
i=i+1
if i<=n then return t[i] end
end
--[[闭包保存内部局部变量(t,i,n)]]
end
6——————范性for
--[[范性for在内部保存迭代函数,<exp_list>返回结果为三个,成为实际上保存的3个值:迭代函数,状态常量(被遍历的表),控制变量(当前索引下标)]]
--[[文法]]
for <var_list> in <exp_list> do
<body>
end
--[[var_list>是一个或多个逗号分隔的变量名列表,<exp_lsit>是以一个或多个逗号分隔的表达式列表,通常只有一个值
for k,v in pairs(t) do
print(k,v)
end 
--[[k,v为变量列表,pairs(t)表达式,t是表]]
7————无状态迭代器
--[[不保留任何状态的迭代器,利用无状态迭代器避免创建闭包花费额外的代价]]
--[[ipairs() 在lua中的实现]]
function iter(a,i)
i=i+1
local v=a[i]
if v then
return i,v
end
end
function ipairs(a)
return iter,a,0
--[[<exp_list>ipairs()返回三个结果]]
end
--[[调用ipairs(a)开始循环,获取三个值,迭代函数iter,状态常量table a,控制变量初始值i=0,iter(a,i),直到nil元素 ]]
--[[lua中的pairs()用next实现的原始方法next(t)]]
function pairs()
return next,t,nil
end
8—————dofile,loadfile,loadstring 编译chunk

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值