2016-08-22 60 views
0

在Python中,我可以编写from my_module import *,并且my_module的所有成员都将在本地范围内可用。例如Python中的“from some_module import *”Lua

我的模块定义:

my_module = {} 
my_module.a = 1 
my_module.b = 2 

使用在另一个文件:

from my_module import * 
return a + b 
#=> 3 

我能做到这一点在Lua?怎么样?

+0

'local my_module = require(“my_module”);本地a,b = my_module.a,my_module.b;返回a + b' –

+0

这更像是'from my_module import a,b'。如果有(极端示例)500个我正在导入的东西呢?我宁愿不手动导入它们。 –

回答

1

要获得在局部范围内的值,你唯一的选择是实际MAME他们:

--in main.lua 
local mymodule = require("mymodule") 
local a, b = mymodule.a, mymodule.b 

--in mymodule.lua 
return {a = 1, b = 2} 

,或者:

--in main.lua 
local a, b = table.unpack(require("mymodule")) 

--in mymodule.lua 
return {1, 2} 

如果你不想对它进行命名相反,唯一的办法就是把它们放在全球范围内。这里有两个例子:

--Python's from mymodule import * 
--in main.lua 
require("mymodule") 
print(a + b) 

--in mymodule.lua 
a, b = 1, 2 


--Python's import mymodule 
--in main.lua 
require("mymodule") 
print(mymodule.a + mymodule.b) 

--in mymodule.lua 
mymodule = {a = 1, b = 2} 

这些都是有效的方法,但最常用和最安全的是第一种。

另一种可能性是尝试改变环境修改_ENV值:

--Python's from mymodule import * 
--in main.lua 
local _ENV = require("mymodule") 

--in mymodule.lua 
return {a = 1, b = 2} 

但随后,通过改变环境,你不会有机会获得在全球范围内的所有变量(除非你预将它们声明为当地人(local print = print; _ENV = require("mymodule"); print(a);),或者将_G表中的所有变量复制到从mymodule返回的表中,这通常不是一件快乐的事情。

0

这是不可能完全实现的,因为修改local的值(debug.setlocal无法定义新的当地人)是不完美的。最好的办法是调整你的环境,因为污染全球范围并不是一个好主意,但这并非不平凡。

这实际上可以完成有点如果仔细做好。我有点说,因为总会有警告,你必须手动调整你的环境,无论你在哪个功能/块。在Lua 5.2+中,需要local _ENV = ...。在Lua 5.1中,setfenv(1, ...)可以做到这一点,而且在眼睛上可以说更容易。

以下是我们可以做的事情。我们首先定义一个返回克隆环境的函数。 clone是一个浅表复制功能。

return function (env) 
    env = clone(env or _G) 

    return env 
end 

接下来,我们添加我们的自定义import函数,直接修改我们的新的环境,而不是返回任何东西(如require一样)。你可以在这里变得更好更复杂,实施不同的方式来决定将什么输入到环境中,以及如何实现。( '*',例如)

-- @module: import.lua 
return function (env) 
    env = clone(env or _G) 

    function env.import (modname, ...) 
     local args = { ... } 
     local m = require(modname) 

     for _, name in next, args 
      env[name] = m[name] 
     end 
    end 

    return env 
end 

,我们可以为使用:

local _ENV = require('import')() 
-- setfenv(1, require('import')()) 

import('module_name', 'a', 'b') 

return a + b 

在小规模,这是开销相当数量,只是为了避免:

local module_name = require('module_name') 
local a, b = module_name.a, module_name.b 

它可能证明更大的文件,许多进口更有用。导入通常以任何方式聚集在文档的顶部,所以额外的噪音并不是很差。如果您可以在某处将env设置为全局值,则看起来更清晰。

local _ENV = env() 

import('webserver', 'open', 'status', 'close') 
import('database', 'connect', 'query', 'disconnect') 
import('json', 'parse', 'stringify') 
... 

而且还可以用来创建沙箱,假设小心与重写import功能不使用require

local my_env = env { print = print } 
my_env.import('my_mod', 'foo', 'bar') 

local chunk = loadfile('my_file.lua', 'bt', my_env) 
相关问题