提问人:ThatsNasu 提问时间:9/3/2023 更新时间:9/3/2023 访问量:45
我在我的桌子创建/返回中缺少什么,它们是零?
What am i missing on my table creations / returns that they are nil?
问:
我目前正在学习并尝试为我为一个非常古老的游戏(Settlers 5 Heritage of Kings)创建的地图编写脚本,在这样做的同时,我试图将我的代码拆分为不同的文件以进行组织,因为我不想将所有代码放在一个文件中。到目前为止,我了解到游戏中实现的 lua 引擎运行在 5.0.2 上。现在来解决我的问题:我有一个名为 s5lualib 的文件,我在其中设置了一些基本值,如下所示:
S5LuaLib = {}
S5LuaLib.mission = _VERSION
S5LuaLib.diplomacy = "world"
S5LuaLib.map = Map
return S5LuaLib
然后在我的 base.lua 文件中调用它,如下所示:
function arbitrary()
local s5lualib = S5LuaLib
-- player one
local playerIndex = s5lualib.map.createNewPlayer()
end
此外,我有一个map.lua文件,其中包含以下内容:
local Map = {}
--Map.environment = Environment
Map.testValue = "Hello World"
Map.players = {}
function Map.createNewPlayer()
player = Player
player.initialize(table.getn(Map.players)+1)
table.insert(Map.players, player)
return player.id
end
return Map
我无法解决的问题是,每当在其上执行脚本统计信息时,都会向我抛出一个错误,即 S5LuaLib.map 为零值。我尝试谷歌搜索,当我创建全局时,它会一直工作,直到它进入函数,告诉我这是一个零值(这里有趣的部分是:无论我将其设置为本地还是全局)。我很想知道为什么至少在第一层进行全局修复,为什么尽管返回了本地,但无法找到它,以及为什么无论我是否将其设置为本地,它都是零。为了清楚起见,我的播放器 .lua 文件:arbitrary()
Map = {}
createNewPlayer()
player
Map = {}
player
local Player = {}
Player.id = 0
Player.color = 0
function Player.initialize(id)
Player.id = id
Player.color = id
end
return Player
游戏附加了一个 lua 调试器,它允许我在运行时读取变量内容、表格内容等,因此我知道在加载文件时,Map 没有得到分配的值,反过来又返回 nil。我仔细检查了引擎是否确实加载了所有必要的文件,仔细检查了拼写错误等。我猜我被一些我不习惯的范围界定恶作剧欺负了(我来自 java,上次使用 lua 是在 ~10 年前)或者只是简单地忽略了,任何提示、帮助和/或答案都是值得赞赏的。map.lua
答:
你应该学习而不是如何工作。
第一条规则:每个返回某些东西的 Lua 脚本都可以是必需
的 第二条规则:首先需要缓存返回,然后每个后续 require 获取缓存的结果 (package.loaded)
所以我对你的建议是......require()
S5LuaLib = {}
S5LuaLib.mission = _VERSION
S5LuaLib.diplomacy = "world"
S5LuaLib.map = require("map")
return S5LuaLib
函数应该做
function arbitrary()
local s5lualib = require("s5lualib")
-- player one
local playerIndex = s5lualib.map.createNewPlayer()
end
并尝试map.lua
player = require("player")
请记住:缓存版本是主版本
,对它们的更改将在整个运行时持续存在,但缓存将被删除(设置为无)。
例
package.loaded.test = function(...) print("Hey!", ...) return(...) end
require("test")("World")
-- ^-> package.loaded.test("World")
-- Destroying and freeing unused Memory
package.loaded.test = nil
collectgarbage()
...不要从文件加载“test.lua”并直接调用缓存的版本。
评论
Script.Load(<path>)
Script.Load(<path>)
在联系了定居者模组社区并获取了有关引擎的一些详细信息后,我发现我的问题是,集成在引擎中的 lua 运行时确实不会从文件中返回本地表,因此定义的所有内容都返回 local 返回 nil。尽管如此,还是感谢您的努力!
评论