In Lua 5.2, ipairs() on any non-table (or table-like) type would throw
an error. In 5.3, ipairs("foo") or ipairs(nil) returns a valid iterator
function, as long as LUA_COMPAT_IPAIRS isn't turned on. (It is turned
on by LUA_COMPAT_5_2, which is the default in the base release.)
For nil, I get something useful on iteration:
> for i, v in ipairs(nil) do print(i, v) end
stdin:1: bad argument #1 to 'for iterator' (table expected, got nil)
stack traceback:
[C]: in function 'for iterator'
stdin:1: in main chunk
[C]: in ?
But for a string I get, unexpectedly, nothing.
> for i, v in ipairs("foo") do print (i, v) end
>
So... Bug, or feature? I vote bug, if for no other reason than the
inconsistent behavior.