Lua表函数返回

时间:2016-07-16 21:28:03

标签: function lua lua-table

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

这是我的表格代码:

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,

}

它应该返回“6.75”

我真的不知道该怎么做,我尝试了一些事情,最终都回来了

  

LuaInterface.LuaScriptException:[string“main”]:108:尝试索引字段'?' (零值)

我想在隧道中返回第3个函数。

2 个答案:

答案 0 :(得分:2)

作为为每个键分配索引的硬编码方式的替代方法,您可以尝试从命令的函数表中获取所有键(请注意,Lua中的映射是无序的;您必须使用数组)并且然后为每个人分配一个索引。当然,这将意味着索引将按字典顺序排列(除非您自己进行排序功能)。这是一个例子:

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]())

答案 1 :(得分:1)

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

-- 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的定义,只需添加一个包含所需顺序的表格。 E.g:

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

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

无论哪种方式,你都需要以某种方式明确表示你认为这些事情的顺序,因为表的键没有顺序。