Deep Learning Lua - Tabla de entorno

El lenguaje Lua guarda el entorno global en sí mismo en la variable global _G y genera los nombres de todas las variables globales en el entorno global de la siguiente manera:

para n en pares (_G) imprime (n) end

  • Variables globales con nombres dinámicos

La adquisición de variables globales en otra variable,

value = load ("return" .. varname) () 和

value = _G [varname] tiene el mismo efecto, este último es un orden de magnitud más eficiente.

  • Declaración de variable global

Las variables globales se pueden utilizar sin declaración, para detectar todos los accesos no existentes de la tabla global, de la siguiente manera:

setmetatable(_G,{
    __newindex = function (_,n)
        error("attempt to write to undeclared varibale "..n,2)
    end,
    __index = function (_,n)
        error("attempt to read to undeclared varibale "..n,2)
    end,
})

Por supuesto, puede usar rawset y rawget para omitir el método meta.

  • Variables no globales

El nombre libre (nombre libre) como: x es equivalente a _ENV.x, _ENV en sí mismo es una variable local, es una tabla arbitraria, llamada entorno.

La forma en que Lua maneja las variables globales:

Antes de compilar todo el código, cree una variable local _ENV en la capa exterior;

Todos los nombres libres var se transforman en _ENV.var;

La función load usa el entorno global para inicializar el primer valor del segmento de código, que es una tabla mantenida internamente por la sintaxis lua.

  • Utilice _ENV

El segmento de código (un archivo) tiene una variable _ENV. _ENV = nil evitará que el código posterior acceda directamente a las variables globales. El objetivo principal de _ENV es cambiar el entorno en el que se utiliza el segmento de código. Utilice la herencia para cargar el entorno antiguo de la siguiente manera:

local newgt = {}
setmetatable(newgt, {__index = _G})
_ENV = newget

Cualquier asignación tiene lugar en la nueva tabla. Solo _G puede usarse para modificar variables en variables globales.

  • Entorno y módulos

_ENV resuelve la contaminación de variables globales.

  • _EVN y carga

Load normalmente inicializa el valor _ENV en el segmento de código cargado en el entorno global y hay un parámetro opcional para especificar un valor inicial diferente para _ENV.

env = {}
loadfile("config.lua","t",env)()

Similar a correr en la caja de arena.

Ejecute un fragmento de código varias veces, cada vez en un entorno diferente, las dos opciones son las siguientes:

El primero usa debug.setupvalue (f, 1, env)

El primer parámetro es la función especificada, el segundo parámetro es el índice de valor ascendente (siempre 1) y el tercer parámetro es el nuevo valor ascendente. [Depende de la biblioteca de depuración, rompe las reglas de visibilidad]

La otra es modificar el segmento de código cada vez que se carga, de la siguiente manera:

lua把所有代码段当做可变长参数函数进行编译,多出来这一行会把传给代码段的第一个参数赋值给_ENV,从而改变环境。

prefix = "_ENV = ...;"
f = loadwithprefix(prefix,io.lines(filename,"*L"))
...
env1 = {}
f(env1)
env2 = {}
f(env2)

 

Supongo que te gusta

Origin blog.csdn.net/Momo_Da/article/details/105598511
Recomendado
Clasificación