我能从一个导入的Lua脚本中访问另一个Lua脚本中的变量吗?

我有两个Lua脚本文件。我想要将文件B导入到文件A中,并允许文件A访问文件B的函数/变量。这可行吗?

我正在使用Lua 5.4。

A.lua

-- 文件A - 返回Nil,即使文件B声明了ImportedVar
-- 将文件B导入
dofile("B.lua");
function main()
    print(ImportedVar);
end
main();

B.lua

-- 文件B
print("文件已加载"); -- 这将打印
local ImportedVar<const> = 5; -- 出于某种原因,A.lua无法访问它...(它只是说它为nil)
点赞
用户6879826
用户6879826

这可能有点尴尬,但你可以将想要公开的变量放在全局表中,在模块的末尾返回它:

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
2020-08-18 03:59:41
用户2702367
用户2702367

A.lua

local bLib = dofile ("B.lua")  // 加载B.lua文件并执行
print(bLib.someVar)   // 打印B.lua中的someVar变量
print(bLib.someFunction())  // 打印B.lua中的someFunction函数返回值

B.lua

print("B loaded")  // 打印B loaded
local bLib={}    // 创建空表bLib
bLib.someVar = 7   // 给bLib表添加变量someVar,值为7

function bLib.someFunction ()   // 给bLib表添加函数someFunction
  return "Hello"    // 函数返回字符串"Hello"
end

return bLib   // 返回bLib表

Run A.lua

$ lua -i A.lua   // 使用lua解释器运行A.lua
Lua 5.3.5  Copyright (C) 1994-2018 Lua.org, PUC-Rio
B loaded   // 打印B loaded
7    // 打印7
Hello   // 打印Hello

希望这有所帮助。

2020-08-18 14:07:56
用户11740758
用户11740758

我喜欢将require()load()结合起来使用...

-- 文件:test.lua
-- 让我们返回所有东西...
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:',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('%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',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
-- 现在cat保存了定义函数的字符串,将其转换为函数...
cat=load(cat,'This is showing up as source with debug.getinfo()')()
cat
function: 0x5666dca0
-- 现在它已经可以使用了

[[]] 中的字符串也可以保存 Lua 字节码,load() 会正确将其转换为任何类型。但是存储键/值对不是一件容易的事情。因此,我没有给出这方面的示例。但是,可以在 SO 上找到用于保存字节码的转储函数示例。

2020-08-18 16:34:44