如何解决我可以从另一个导入的lua脚本访问lua脚本中的变量吗?
我有两个Lua脚本文件。我想将文件B导入文件A,并允许文件A访问文件B的功能/变量。这可能吗?
我正在使用Lua 5.4。
A.lua
-- File A - Returns Nil,even though File B declares ImportedVar
dofile("B.lua");
function main()
print(ImportedVar);
end
main();
B.lua
-- File B
print("File Loaded"); -- This prints
local ImportedVar<const> = 5; -- This can not be accessed from A.lua for some reason... (it just says that it is nil)
解决方法
这有点尴尬,但是您可以将要公开的变量放在全局表中,并在模块末尾将其返回:
MyLib.lua
print("Loaded MyLib")
local importantVariable = 42
local function importantFunction ()
return importantVariable
end
return { importantVariable = importantVariable,importantFunction = importantFunction,}
然后,要导入模块,请使用require
:
MyMain.lua
local MyLib = require "MyLib"
io.write(string.format("importantVariable is: %d\n",MyLib.importantVariable))
io.write(string.format("importantFunction returns: %d\n",MyLib.importantFunction()))
运行myMain.lua
:
$ lua -i myMain.lua
Lua 5.3.5 Copyright (C) 1994-2018 Lua.org,PUC-Rio
Loaded MyLib
importantVariable is: 42
importantFunction returns: 42
,
A.lua
local bLib = dofile ("B.lua")
print(bLib.someVar)
print(bLib.someFunction())
B.lua
print("B loaded")
local bLib={}
bLib.someVar = 7
function bLib.someFunction ()
return "Hello"
end
return bLib
运行A.lua
$ lua -i A.lua
Lua 5.3.5 Copyright (C) 1994-2018 Lua.org,PUC-Rio
B loaded
7
Hello
希望有帮助
,我喜欢结合使用-require()和load()...
-- File: test.lua
-- Lets return all the stuff...
return {
cat=[[return function(cat)
for line in io.lines(cat) do
io.write(string.format('%s\n',line))
end
end]],free=[[return function()
local a=(collectgarbage('count')*1024)
print('Before:',a,'Byte')
collectgarbage()
print('After:',(collectgarbage('count')*1024),'Byte')
a=a-collectgarbage('count')*1024
print('Freed:','Byte')
return a
end]],shell=[[return function(shell)
if (type(shell)=='string') then
os.execute(shell)
else
os.execute('/bin/bash')
end
end]],cmd=[[return function(cmd)
cmd=io.popen(cmd,'r')
cmd=cmd:read('a+')
return cmd
end]],printf=[[return function(prf,...)
io.write(prf:format(...))
end]]
}
让我们在控制台中玩...
# lua -i
Lua 5.3.5 Copyright (C) 1994-2018 Lua.org,PUC-Rio
> test=require('test')
> test
table: 0x5666d290
> test.cat
return function(cat)
for line in io.lines(cat) do
io.write(string.format('%s\n',line))
end
end
> cat=load(test.cat,'My file viewer')()
> cat
function: 0x56686810
> cat('test.lua')
return {
cat=[[return function(cat)
for line in io.lines(cat) do
io.write(string.format('%s\n',...)
io.write(prf:format(...))
end]]
}
因此,使用require的第一步将代码加载到带有字符串的表中。 第二步执行load()将字符串代码转换为函数。 特殊的require()可以让您仅获取想要的内容...
cat=require('test').cat
-- Now cat holds the string with function defining
-- Lets make a function from it...
cat=load(cat,'This is showing up as source with debug.getinfo()')()
cat
function: 0x5666dca0
-- Now it is ready for use
[[]]
中的字符串还可以保存Lua字节码,这些字节码可以将load()正确地转换为它。但是,存储键/值对并非易事。因此,我不提供任何示例。但是可以在SO上找到用于保存字节码的转储函数示例。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。