Lua: Tables: 比较键(而不是它们的值)

我非常新于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

为什么dialogueMode == DialogueMode.uniqueDialogue 不像我期望的那样工作?我如何让它按照我期望的方式工作?我正在尝试使用表作为枚举器,但是这给我带来了问题。

提前感谢!

点赞
用户1975276
用户1975276

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

例如:

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

打印:

table: 140b90e8 table: 140b90e8
2018-07-03 15:19:12
用户10018042
用户10018042

问题在于,你想要打印什么?你只想要将表格打印出来吗?如果你想要使函数递归搜索表格并将其打印出来,那比你现在所拥有的更加复杂,仅仅因为递归的本质如此。

此外,dialogueMode == DialogueMode.uniqueDialog 返回 false 的原因是因为 dialogueMode 被赋值为 k,即字符串 "uniqueDialog"。而 DialogueMode.uniqueDialog 是整个 uniqueDialog 表格,而 dialogueMode 只是键值、表的名称,被转换为字符串。代码可以如下:

--不是我的代码,信誉在这里: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

编辑:不确定你想要什么,但希望这对你有所帮助。

2018-07-03 16:06:14
用户10018042
用户10018042

我不确定你具体想要什么,但或许你可以修改以下代码并在此基础上进行。这段代码循环遍历并检查是否能在 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
2018-07-03 16:26:43