It was thus said that the Great Jonathan Goble once stated:
> So why is it a bad idea? One, because indexing through a metamethod is
> slower than directly indexing the actual `string` table, and two, because
> shadowing a built-in global (whether with a global or local assignment) is
> usually a code smell (in any language) and generally shouldn't be done
> without a very good reason.
You have to shadow the built-in globals for modules written in Lua 5.1
because the global environment goes away when you call module(). I still
do that in Lua 5.3 because I attempt to maintain compatability with Lua 5.1:
local _VERSION = _VERSION
local math = require "math"
local string = require "string"
local io = require "io"
local pairs = pairs
local tostring = tostring
local type = type
local print = print
local pcall = pcall
local getmetatable = getmetatable
if _VERSION == "Lua 5.1" then
module("org.conman.table")
else
_ENV = {} -- luacheck: ignore
end
function dump(name,value)
-- ...
end
if _VERSION >= "Lua 5.2" then
return _ENV -- luacheck: ignore
end
Yes, I require() the base modules because that signals intent. If I could
require() global functions like type() or pcall(), I would do that as well
(if I could do that, a side effect is that the only global in scope would be
require()).
-spc
As I said, "generally shouldn't be done ***without a very good reason***." This is one example of such a very good reason.