我能从一个导入的Lua脚本中访问另一个Lua脚本中的变量吗?
2020-8-18 3:29:0
收藏:0
阅读:150
评论:3
我有两个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)
点赞
用户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
我喜欢将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
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

这可能有点尴尬,但你可以将想要公开的变量放在全局表中,在模块的末尾返回它:
print("Loaded MyLib") local importantVariable = 42 local function importantFunction () return importantVariable end return { importantVariable = importantVariable, importantFunction = importantFunction, }然后,使用
require导入模块: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