Lua: Таблицы: сравнить ключи (не их значения) - PullRequest
0 голосов
/ 03 июля 2018

Я очень плохо знаком с Луа, поэтому, пожалуйста, не возражайте против вопроса новичка. Я не смог найти свой точный вопрос здесь из-за странной формулировки.

У меня есть следующая таблица:

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 table: 4df7e3ad false

Почему dialogMode == DialogueMode.uniqueDialogue не работает так, как я ожидал, и как мне заставить его работать так, как я этого ожидаю? Где я проверяю, равен ли dialogMode ключу в таблице. Я эффективно пытаюсь использовать таблицу в качестве перечислителя, но это вызывает у меня проблемы.

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 03 июля 2018

Вопрос здесь в том, что вы пытаетесь напечатать? Вы хотите, чтобы это просто свалило со стола? Если вы хотите, чтобы функция рекурсивно искала таблицу и распечатывала ее, это более сложно, чем то, что вы получили, просто из-за природы рекурсии.

Кроме того, причина, по которой dialogueMode == Dialoguemode.uniqueDialog возвращает ложь, заключается в том, что 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  

РЕДАКТИРОВАТЬ: Не уверен, что именно вы ищете, это может быть не так, но, надеюсь, это поможет вам в некотором роде.

0 голосов
/ 03 июля 2018

Опять же, я не уверен на 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
0 голосов
/ 03 июля 2018

Видимо v хранит правильное сравнение.

И.Е.

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

Печать:

table: 140b90e8 table: 140b90e8 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...