*Luaで良く作る関数 ~文法編~ [#tfd3313e] -[[enum>#enum]] &aname(enum); **enum [#i4b17115] - enum.luaとして保存 #sh(lua){{ local enum = {} local len_key = "len" local _ = {} setmetatable(_, {__mode = "k"}) function enum:__len() local i = 0 for k, v in pairs(_[self]) do if k ~= len_key then i = i + 1 end end return i end function enum:new(o) local t = {} _[t] = {[len_key] = enum.__len} for k, v in pairs(o) do if tonumber(k) ~= nil then k, v = v, k - 1 end if _[t][k] ~= nil then error('"' .. k .. '" can not be set.', 2) end _[t][k] = v end return setmetatable(t, self) end function enum:__index(k) if _[self][k] == nil then error('"' .. k .. '" is undefined enumerator.', 2) end return _[self][k] end function enum:__newindex() error("enum is read-only.", 2) end return enum }} ~ - 使い方~ test.lua #sh(lua){{ enum = require "enum" test = enum:new{"aa", "bb", cc = 100} print(test.aa) --> 0 print(test.bb) --> 1 print(test.cc) --> 100 print(#test) --> 0 (Lua5.1) or 3 (Lua5.2) print(test:len()) --> 3 --print(test.dd) --> error : "dd" is undefined enumerator. --test.aa = 10 --> error : enum is read-only. }}