Lua Table 函数返回

Lua Table Function returning

所以基本上我想要的是当你在 table 中有一组函数时,能够像 print(timeRequirements[3]()) 一样调用它,做与 print(timeRequirements["old_man"]()

这是我的 table 代码:

timeRequirements = {

        bulbasaur = function() --RESET
            if BEAST_MODE then
                return 1.99
            end
            return 2.22
    end,

    nidoran = function() --RESET
        if BEAST_MODE then
            return 6
        end
        return 6.4 + timeSaveFor("spearow")
    end,

    old_man = function()
        return 6.75 + timeSaveFor("spearow")
    end,

    forest = function()
        return 9.33 + timeSaveFor("spearow")
    end,

    brock = function()
        return 11 + timeSaveFor("spearow")
    end,

    shorts = function() --TWEET
        local timeLimit = 13.75 + timeSaveFor("spearow")
        timeLimit = timeLimit + (3 - stats.nidoran.rating) * 0.2
        return timeLimit
    end,

    mt_moon = function() --RESET
        if BEAST_MODE then
            return 24.75
        end

        local timeLimit = 25.50 + timeSaveFor("paras")
        if Pokemon.info("nidoking", "level") >= 18 then
            timeLimit = timeLimit + 0.33
        elseif Pokemon.getExp() > 3730 then
            timeLimit = timeLimit + 0.15
        end
        if stats.nidoran.attack > 15 then
            timeLimit = timeLimit + 0.25
        end
        if stats.nidoran.speed > 14 then
            timeLimit = timeLimit + 0.25
        end
        return timeLimit
    end,

    mankey = function()
        return 31.25 + timeSaveFor("paras")
    end,

    bills = function()
        return 36 + timeForStats() + timeSaveFor("paras")
    end,

    misty = function() --PB
        return 37.75 + timeForStats() + timeSaveFor("paras")
    end,

    vermilion = function()
        return 42.25 + timeForStats()
    end,

    trash = function() --RESET
        if BEAST_MODE then
            return 45.75
        end
        return 47.25 + timeForStats()
    end,

    safari_carbos = function()
        return 68.25 + timeForStats()
    end,

    victory_road = function() --PB
        return 97.3
    end,

    e4center = function()
        return 99.75
    end,

    blue = function()
        return 106.25
    end,

    champion = function() --PB
        return 112
    end,

}

应该return "6.75"

我真的不知道该怎么做,我尝试了一些东西,最后都 returning

LuaInterface.LuaScriptException: [string "main"]:108: attempt to index field '?' (a nil value)

我想return隧道中的第三个功能。

您可以将每个函数添加两次,一次使用字符串键,一次使用数字键,如下所示:

-- Had to add this, since it's used in the old_man function
function timeSaveFor()
    return 0
end

timeRequirements = {}

timeRequirements.bulbasaur = function() --RESET
    if BEAST_MODE then
        return 1.99
    end
    return 2.22
end
timeRequirements[1] = timeRequirements.bulbasaur

timeRequirements.nidoran = function() --RESET
    if BEAST_MODE then
        return 6
    end
    return 6.4 + timeSaveFor("spearow")
end
timeRequirements[2] = timeRequirements.nidoran

timeRequirements.old_man = function()
    return 6.75 + timeSaveFor("spearow")
end
timeRequirements[3] = timeRequirements.old_man

print(timeRequirements["old_man"]()) -- 6.75
print(timeRequirements[3]()) -- 6.75

作为替代方案,您可以按原样保留 timeRequirements 的定义,只需按您想要的顺序添加 table。例如:

local order = { "bulbasaur", "nidoran", "old_man", "forest", "brock", "shorts", ... }

print(timeRequirements["old_man"]()) -- 6.75
print(timeRequirements[order[3]]()) -- 6.75

无论哪种方式,您都需要以某种方式明确说明您认为这些东西的顺序,因为 table 的键没有顺序。

作为为每个键分配索引的硬编码方式的替代方法,您可以尝试从函数 table 中获取所有键(请注意,映射在 Lua 中是无序的;您d 必须使用一个数组),然后为它们每个分配一个索引。当然,这意味着索引将按字典顺序排序(除非您创建自己的排序函数)。这是一个例子:

ftable = {
  name1 = function()
    return "name1 func"
  end,
  name2 = function()
    return "name2 func"
  end,
}

names = {}
for k, _ in pairs(ftable) do
  table.insert(names, k)
end
table.sort(names)

for i, name in ipairs(names) do
  ftable[i] = ftable[name]
end

print(ftable["name1"]())
print(ftable[1]())