Lua — Повторять до тех пор, пока в текущей таблице не появится исключение ‘попытка индексировать нулевое значение’

#lua

#lua

Вопрос:

Хорошо, я покажу пример

Я хочу сделать это :

 local x = {}

repeat 
-- wait function
until x.lel.ciao
  

Но у меня есть эта ошибка :
input:3: attempt to index a nil value (field 'lel')

Итак, я могу просто сделать это :

 local x = {}

repeat 
-- wait function
until x.lel and x.lel.ciao
  

но если у меня длинный путь, как я могу сделать?
Нравится :
x.lel.ciao.value1.title1.text1
я не хочу делать :

 local x = {}

repeat 
-- wait function
until x.lel and x.lel.ciao and x.lel.ciao.value1 and x.lel.ciao.value1.title1 and x.lel.ciao.value1.title1.text1
  

У кого — нибудь есть идея ? как функция safepath(x.lel.ciao.value1.title1.text1)

Комментарии:

1. Запустите свою программу с debug.setmetatable(nil, {__index={}})

Ответ №1:

Точно так же, как комментарий Егора (спасибо Егору), debug.setmetatable позволяет вам установить метатаблицу для типа объекта (не экземпляра объекта).

Это связано с проблемой,

Все объекты этого типа также унаследуют mtatable.

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

Возьмем в качестве примера следующий код:

 debug.setmetatable(nil, { __index = {} })
repeat
    . . . -- Your code goes here
until x.lel.ciao.value1.title1.text1

function getFrom(data, value)
    return date[value]
end

. . . -- More code
  

С точки зрения этой простой области видимости вы можете быстро увидеть проблему, но представьте, что этот код скрыт тысячами строк и функций.

В конечном итоге вы столкнетесь с безумием, поскольку оно возвращает только nil, чего вообще не должно происходить, потому что, ну, вы уверены, что ваша data переменная имеет такое значение, верно?

Чтобы избежать подобного, вы должны безопасно сделать это следующим образом:

 debug.setmetatable(nil, { __index = {} })
repeat
    . . . -- Your code goes here
until x.lel.ciao.value1.title1.text1
debug.setmetatable(nil, nil)
  

Согласно ссылке Lua, установка метатаблицы в nil приведет к удалению метатаблицы, таким образом, вы будете только временно игнорировать обратную связь от nil во время выполнения внутри цикла повтора.