Отладка неожиданного нуля в моем метатабильном скрипте - PullRequest
2 голосов
/ 11 февраля 2020

Я играл с этим метатабелем, и эту ошибку труднее всего исправить:

local Check = {
    InvitedMembers = {
        John = "Allowed",
        Mary = "Allowed",
        Halley = "Allowed"
    }
}
local Filter = {
    __index = function(t,k)
        for i ,v in pairs(t.InvitedMembers) do
            if i ~= k then
                error("You're not invited by us")
            elseif i == k then
                return "This way"
            end
        end
    end
}
local ConnectFilter = setmetatable(Check,Filter)
print(Check.InvitedMembers.Sans)

Я попытался создать фильтр, однако этот код возвращает значение nil.

1 Ответ

2 голосов
/ 11 февраля 2020

В вашем коде есть две ошибки:

Вы индексируете неверную таблицу

Вы звоните setmetatable на Check, а не на Check.InvitedMembers. Чтобы исправить свой код, вы должны написать

print(Check.Sans)

, и вы получите сообщение об ошибке «Мы не приглашены»

Вы выдаваете ошибку слишком рано

В вашем l oop вы либо return, либо выбрасываете ошибку, поэтому вы никогда не пройдете первую итерацию.

Если вы хотите исправить l oop, вы ' Я должен написать это так:

for i ,v in pairs(t.InvitedMembers) do
  if i == k then
    return "This way"
  end
end
error("You're not invited by us")

, то есть пробежаться по списку и сразу же вернуться, когда имя будет найдено, но не ошибаться, пока не закончите со всем списком.

Но лучший способ исправить это - просто сделать следующее:

local Filter = {
    __index = function(t,k)
      if t.InvitedMembers[k] then
        return "This way"
      else
        error("You're not invited by us")
      end
    end
}

Поскольку при индексации таблиц с ключом, которого у них нет, просто возвращается nil, так что вы можете легко найти вне, если ключ существует в таблице.

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