function mutstring (s) assert(type(s) == "string", "string expected") local ms = s or "" local u = newproxy(true) local mt = getmetatable(u) local relatpos = function(p) local l = #ms if p < 0 then p = l + p + 1 end if p < 1 then p = 1 end return p, l end mt.__index = function(_, k) assert(type(k) == "number", "number expected as key") local k, l = relatpos(k) if k <= l then return ms:sub(k, k) end end mt.__newindex = function(_, k, v) assert(type(k) == "number", "number expected as key") assert(type(v) == "string" and #v == 1, "character expected as value") local k, l = relatpos(k) if k <= l + 1 then ms = ms:sub(1, k - 1) .. v .. ms:sub(k + 1, l) end end mt.__len = function(_) return #ms end mt.__tostring = function(_) return ms end return u end s = mutstring("Lua race") print(s[5]) s[5] = "f" print(s)
2.
local mt = getmetatable('') local index = mt.__index mt.__index = function (str, ...) local k = ... if 'number' == type(k) then return index.sub(str, k, k) else return index[k] end end local a = 'abc' for k = 1, #a do print(a[k]) end print(a:upper())