我在我的桌子创建/返回中缺少什么,它们是零?

What am i missing on my table creations / returns that they are nil?

提问人:ThatsNasu 提问时间:9/3/2023 更新时间:9/3/2023 访问量:45

问:

我目前正在学习并尝试为我为一个非常古老的游戏(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()playerMap = {}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 lua-table

评论


答:

0赞 koyaanisqatsi 9/3/2023 #1

你应该学习而不是如何工作。
第一条规则:每个返回某些东西的 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”并直接调用缓存的版本。

评论

0赞 ThatsNasu 9/3/2023
首先:感谢您的回答,我会尽量牢记需求!现在说到可悲的事情:我试图要求它,这导致一切都为零,如果我正确理解要求,这有点意义,因为它不知道从哪里加载文件,对吧?通常,地图的脚本全部保存在一个文件中,最后将被打包到地图文件本身中,因此游戏引擎不支持多文件内容是有道理的。但是,该引擎提供了一个功能,但仅加载脚本文件不起作用(因此我的问题)Script.Load(<path>)
0赞 ThatsNasu 9/3/2023
我可以加载脚本,它们确实被加载了,但问题是,如果脚本包含一个本地表,即使返回它,我要么无法访问它,要么它不会被初始化,我真的不明白为什么Script.Load(<path>)
0赞 ThatsNasu 9/3/2023 #2

在联系了定居者模组社区并获取了有关引擎的一些详细信息后,我发现我的问题是,集成在引擎中的 lua 运行时确实不会从文件中返回本地表,因此定义的所有内容都返回 local 返回 nil。尽管如此,还是感谢您的努力!