Lua:表格:比较键(不是它们的值)

时间:2018-07-03 14:31:35

标签: lua

我对lua非常陌生,所以请不要介意新手问题。由于措辞怪异,我无法在此处找到确切的问题。

我有下表:

local DialogueMode = {
  uniqueDialogue = {0, 3},
  general = {1, 2},
  job = {3, 5},
  rumors = {4, 3},
  annoyed = {5, 0},
  pissed = {6, 0},
  ignore = {7, 0}
}

以及以下循环:

  for k,v in pairs(DialogueMode) do
    print(k .. ' ' .. tostring(isDialogueModeCompatible(playerTools, npc, k)))
  end

这是if函数:

local function isDialogueModeCompatible(playerTools, npc, dialogueMode)
  print(tostring(dialogueMode) .. " " .. tostring(DialogueMode.uniqueDialogue) .. " " .. tostring(dialogueMode == DialogueMode.uniqueDialogue))
end

对于uniqueDialogue,它会打印出:

uniqueDialogue table: 4df7e3ad false

为什么dialogMode == DialogueMode.uniqueDialogue不能按我预期的方式工作,以及如何使其按预期运行?我在哪里检查dialogMode是否等于表中的键。我实际上正在尝试将表用作枚举数,但这给我带来了问题。

谢谢!

3 个答案:

答案 0 :(得分:1)

这里的问题是,您要打印什么?您要它只是转储桌子吗?如果您希望函数以递归方式搜索表格并打印出来,那么这比递归的结果要复杂得多。

此外,dialogueMode == Dialoguemode.uniqueDialog返回false的原因是为dialogueMode分配了值k,它是字符串"uniqueDialog"。  Dialoguemode.uniqueDialog是整个uniqueDialog表,而dialogueMode只是键,即表的名称,已转换为字符串。

代码如下:

--Not my code, credit here: https://gist.github.com/hashmal/874792
function tprint(tbl, indent)
  if not indent then indent = 0 end
  for k, v in pairs(tbl) do
    formatting = string.rep("  ", indent) .. k .. ": "
    if type(v) == "table" then
      print(formatting)
      tprint(v, indent+1)
    else
      print(formatting .. v)
    end
  end
end

tprint(DialogueMode)

请注意,这可能不适用于所有情况,但对于您的表,它确实会成功转储整个表。如果您遇到错误,请检查github以获取修复(或自行修复:D)

这是使用DialogueMode表时得到的输出:

pissed:     
  1: 6  
  2: 0  
rumors:     
  1: 4  
  2: 3  
general:    
  1: 1  
  2: 2  
ignore:     
  1: 7  
  2: 0  
annoyed:    
  1: 5  
  2: 0  
job:    
  1: 3  
  2: 5  
uniqueDialogue:     
  1: 0  
  2: 3  

编辑:不确定您要查找的是什么,也许不是,但是希望它对您有所帮助。

答案 1 :(得分:1)

同样,我也不是100%确定您要查找的内容,但是也许您可以修改此代码并从那里开始工作。这段代码循环并检查是否可以在DialogueMode中找到与其当前正在打印的表相同的表。如果表不相同,则不会在表旁边打印“ true”。

无论如何,这是代码,我希望它以某种方式对您有帮助。如果不是,请删除此答案:

local DialogueMode = {
  uniqueDialogue = {0, 3},
  general = {1, 2},
  job = {3, 5},
  rumors = {4, 3},
  annoyed = {5, 0},
  pissed = {6, 0},
  ignore = {7, 0}
}

local function isDialogueModeCompatible(playerTools, npc, dialogueMode)
  for v, x in pairs(DialogueMode) do
    if (DialogueMode[v] == dialogueMode) then
      bool = true;
      int = v;
      break;
    end
  end
  return(tostring(dialogueMode)..". Match Found: "..tostring(bool));
end

for k,v in pairs(DialogueMode) do
  print(k .. ' ' .. tostring(isDialogueModeCompatible(playerTools, npc, v)));
end

答案 2 :(得分:0)

显然,v存储了正确的比较。

IE。

  for mode, value in pairs(DialogueMode) do
      print(tostring(value) .. " " .. tostring(DialogueMode.uniqueDialogue) .. " ")
  end

打印:

table: 140b90e8 table: 140b90e8