I have this Lua code:
local string = "" print(string.format("%X", 16777216))
And it works perfectly, but I was told it's wrong? What's wrong with it?
Why shouldn't I do this?
Let's break it down:
> local string = ""
The variable `string` is now an empty string and, in this scope, no longer references the `string` standard library.
> print(string.format("%X", 16777216))
Here, Lua first looks up `string.format`. While `string` no longer refers to the string standard library, it is an actual string, and strings (since Lua 5.1) have a metatable with an __index metamethod pointing to the actual string library (which isn't changed by your local `string` assignment, nor would an assignment to the global `string` affect it). So the lookup of `string.format` produces, via metamethod, the string standard library function `format`. From there, you can call it with whatever arguments you want.
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.