zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    leetcode144 longest-palindromic-substring
    数据结构之二叉树
    数据结构之堆
    数据结构之图
    数据结构之排序
    数据结构之动态规划
    14 RPC
    数据结构之字符串
    数据结构之散列表
    16 中间人攻击
  • 原文地址:https://www.cnblogs.com/timeObjserver/p/7511359.html
Copyright © 2011-2022 走看看