博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LUA 环境
阅读量:7208 次
发布时间:2019-06-29

本文共 1065 字,大约阅读时间需要 3 分钟。

LUA中环境是指一个函数执行的表,即一个函数在什么表中执行。

这里的函数是特殊的,是loadfile("x.lua")的返回值。

loadfile("x.lua")从x.lua文件加载源码,形成一个源码块,但没有执行。只有手动去执行它才会真正运行其中代码,如下:

local func = loadfile("x.lua")

func() --执行该源码,开始逐行运行x.lua中的代码,如 require, 函数外的print等。

如何设置环境呢,如下:

local env = {}

setfenv(func, env)

这样就设置了x.lua的执行环境为表env。这有二层意思:

1,执行func()后,env中就有了x.lua中所有的东西。

2,x.lua的视野被限制在了env中。env中没有的东西都不可用

示例如下:

1,rect.lua

Rect = {}Rect.Init = function(self, x,y,w,h)    self.x = x    self.y = y    self.w = w    self.h = h    print("init------------", x, y, w, h)end

2,testenv.lua

local func = loadfile("rect.lua")--加载源文件,并以函数的形式返回local env = {}setmetatable(env, {__index = _G})--继承全局环境,如果不继承则setfenv后无法使用LUA API,如print等if type(func) == "function" then    setfenv(func, env)    func() --在环境env中执行源文件,执行后env中就有了Rect类end--生成一个新环境的好处是:执行时是在新环境(即新表)中执行的,--生成数据和操作数据都是对新环境(新表)的操作,不会影响全局环境_Glocal Rect = env.RectRect:Init(1,2,3,4)--也可以这样调用,类似_G["a"]的用法env["Rect"]:Init(3,5,3,5)--注意type(k) == "string"for k, v in pairs(env) doprint(k, type(k)) -- Rect stringend

 

转载于:https://www.cnblogs.com/timeObjserver/p/7511359.html

你可能感兴趣的文章
2014.09线上课堂报名帖:敏捷个人手机应用使用
查看>>
C# 重启exe
查看>>
Web 服务器 之 简易WWW服务器的架设
查看>>
一种电子病历系统软件框架思想
查看>>
轻松破解NewzCrawler时间限制
查看>>
gDebugger 3.1.1 原版+破解
查看>>
C++ 对象的内存布局(上)
查看>>
在Outlook中用VBA导出HTML格式邮件
查看>>
搭建一个免费的,无限流量的Blog----github Pages和Jekyll入门
查看>>
PHP——通过下拉列表选择时间(转)
查看>>
由1433端口入侵,浅谈sqlserver安全 (转)
查看>>
2个YUV视频拼接技术
查看>>
spring data实现自定义的repository实现类,实现跟jpa联通
查看>>
“惊群”,看看nginx是怎么解决它的
查看>>
Theano3.3-练习之逻辑回归
查看>>
利用RGB-D数据进行人体检测 带dataset
查看>>
live555的编译及使用
查看>>
C++builder XE 安装控件 及输出路径
查看>>
优点和阵列的缺点,并且一个链表
查看>>
CSS3透明属性opacity
查看>>