U Не понял? Я точно уже не помню, но при закрытии стейта вроде и так просто всё собирается, разве нет? (Ну вроде да правда я не помню уже как там emergency gc со всем этим работает... Вроде бы emergency gc финалайзеры и не вызывает, т.к для этого надо объект "воскресить" и ещё на стеке место на его вызов, а в emergency мы могли войти как раз из-за нехватки стека. Собственно ассерты об этом же и говорят...)U Насколько я смутно помню, externalstring "деструктор" он только для освобождения собственно памяти строки, и со стейтом луашным из него взаимодействовать нельзя. Слегка похоже на то, как в luau финалайзеры юзердаты в целом сделаны, но не суть... По сути это более оптимизированная версия на случай, когда надо внешние ресурсы прибить, без оверхеда. Вроде-бы новый лоадер нативных либ так её использует... Хотя канонично это всё делали для переиспользования памяти константных строк между независимыми стейтами, а не вот это всё... К слову большой вопрос стоило-ли оно того, т.к теперь надо по ещё одному указателю прогуляться, чтобы собственно данные строки получить... но да ладно.
SnusmumrikenГлавное при этом не попасть в касту бородатых очкастых фурри в свитере с оленями и с головой оленя.
Олени Санты - сильные уверенные в себе женщины.
Возвращаясь к теме глобалок - хотелось сделать нечто вроде:
if Lua_version < 5.5 then
require 'strict'
else
load('global none')()
x = 10 -- x не запрещена
end
y = 20 -- а здесь и подавно
Всё из-за скоупов. В принципе, это странный дизайн - глобальные переменные должны быть глобальными, в этом их назначение, а то мы фактически получили ещё один вид локалок. И смысл?
U Опять-таки, это не замена поведения глобалок, это чисто компайл-тайм проверки для сохранения времени и нервов в случае опечаток и прочего) Потому, что в луа, по умолчанию, если переменная не определена как локалка - значит юзаем глобалки. Здесь же, если ты явно прописал какие глобалки ты хочешь чтобы были глобалками и только они - будет ошибка во время загрузки исходника, а не исполнения.U Такое можно сделать маленьким костыликом, написав условный if Lua_version >= 5.5 then function my_load(str) return load("global print, assert, table, string, etc; " ... str) end else my_load = load end :) и повторить на все функции загрузки кода подобное... Можно ещё <const> вдобавок навесить вроде)
U В пределах цельного куска кода так сказать, да. По очевидным причинам. global ключевое слово просто стоит больше интерпретировать как "allow_only_theese_globals_here", тогда всё становится проще к пониманию) Ну и в разных файлах, само собой, может захотеться естественным образом навесить свои уникальные ограничения... Так что...