Я часто делаю расширения для встроенных таблиц. Я делаю это прежде всего, когда думаю, что чего-то действительно важного не хватает. Капитализация не попала в мой «важный» список, но что-то под названием string.split
имеет, например.
Когда я делаю это, я придерживаюсь соглашения о программировании:
require 'stringutil' -- load extra stuff into string.*
require 'osutil' -- load extra stuff into os.*
Вы поняли идею.
Еще одна вещь, которую я делаю, когда я осторожен, это стараюсь не перезаписывать то, чего еще нет, так что я на будущее:
function extend(tab, field, val)
if tab[field] == nil then
tab[field] = val
return val
elseif tab[field] ~= val then
error(string.format('Extension %s.%s failed: already occupied by %s',
nameof(tab), field, tostring(val)))
else
return val
end
end
Функция nameof
выглядит следующим образом:
function nameof(val)
for name, v in pairs(_G) do if v == val then return name end end
return '?'
end
Последнее замечание: когда я собираюсь поделиться кодом с другими, я не склонен модифицировать предопределенные таблицы. Согласно Золотому правилу, это пространство имен является общим для всех, и если я собираюсь, чтобы другие люди использовали мой код, было бы несправедливо просто захватывать любые поля в предопределенной таблице string
.