То, что вы сейчас делаете, следующее:
lua A.lua
> lua process starts
> loading A.lua
> loading test.lua (because it is required by A.lua)
> set global "num" to value 2
> set global "num" to value 5
> lua process exits (A.lua finished)
lua B.lua
> lua process starts
> loading B.lua
> loading test.lua (because it is required by B.lua)
> set global "num" to value 2
> print global "num" (which was set to 2 by test.lua)
> lua process exits (B.lua finished)
Чтобы напечатать значение 5, ваши сценарии должны выглядеть так:
-- test.lua
num = 2
-- A.lua
require("test")
num = 5
-- B.lua
require("test")
require("A")
print(num)
, которые приведут к:
lua B.lua
> lua process starts
> loading B.lua
> loading test.lua (because it is required by B.lua)
> set global "num" to value 2
> loading A.lua (because it is required by B.lua)
> skip loading test.lua (has already been loaded)
> set global "num" to value 5
> print global "num"
> lua process exits (B.lua finished)
РЕДАКТИРОВАТЬ: Я вижу, что вы используете C Api Lua, а не Lua для выполнения ваших скриптов. Используя программирование api, вы должны получить желаемый результат, выполнив A.lua и B.lua, используя одно и то же lua-состояние (чаще всего хранящееся в C-Variable "L").
Подводя итог вышеприведенному обсуждению: В вашем подходе есть различные проблемы:
Аргументом к NSSetUncaughtExceptionHandler
является указатель на функцию C. Вы можете передать замыкание в Swift, но только если замыкание не захватывает какой-либо контекст. В вашем случае замыкание не может использовать self
. Решение из Как использовать метод экземпляра в качестве обратного вызова для функции, которая принимает только функцию или закрытие литерала ? не может использоваться здесь, потому что NSSetUncaughtExceptionHandler()
не имеет параметра «context».
Даже если вам удастся сослаться на делегат приложения в обработчике исключений: он может вызываться в любом потоке, поэтому может вызываться неопределенное поведение для вызова любых связанных с пользовательским интерфейсом методов, таких как добавление представлений или меток. [ 1113]
NSSetUncaughtExceptionHandler
ловит только исключения Objective-C, но не ошибки Swift (из throw
) или исключения среды выполнения Swift (такие как «неожиданно найденный ноль»).
Даже если исключение поймано, вы не можете «обработать» его таким образом, чтобы программа продолжала впоследствии. Он все равно рухнет.
Вы написали в комментарии
Я хочу справиться с этим, когда получаю нулевые значения из моего API ... но чтобы быть в безопасности, я хочу предотвратить приложение от авария.
blockquote>Обработчик исключений не подходит для этой цели. Используйте необязательную привязку, дополнительные приведения, охранники и т. Д. Для обработки ответа и избегайте исключений времени выполнения.