• LUA 环境


    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
    
    --生成一个新环境的好处是:执行时是在新环境(即新表)中执行的,
    --生成数据和操作数据都是对新环境(新表)的操作,不会影响全局环境_G
    local Rect = env.Rect
    Rect:Init(1,2,3,4)
    
    --也可以这样调用,类似_G["a"]的用法
    env["Rect"]:Init(3,5,3,5)
    
    --注意type(k) == "string"
    for k, v in pairs(env) do
    print(k, type(k)) -- Rect string
    end
  • 相关阅读:
    SVG前戏—让你的View多姿多彩
    分享几个Android很强势的的开源框架
    终于,我还是下决心学Java后台了
    金9银10,分享几个重要的Android面试题
    django-多表操作2
    python基础-文件操作
    django-单表操作
    django-多表操作
    django-模板层基础2
    djano-模板层基础知识
  • 原文地址:https://www.cnblogs.com/timeObjserver/p/7511359.html
Copyright © 2020-2023  润新知