我可以从另一个导入的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: %dn",
MyLib.importantVariable))
io.write(string.format("importantFunction returns: %dn",
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

我喜欢组合-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('%sn',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:',a,'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('%sn',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('%sn',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:',a,'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]]
}

因此,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上找到一个保存字节码的转储函数示例

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

希望这能帮助

最新更新