*Luaで良く作る文法 ~変数編~ [#a5be2e33]

-[[enum>#enum]]
-[[getfield>#getfield]]
-[[setfield>#setfield]]

&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.
}}

&aname(getfield);
**getfield [#pc911cee]
- グローバルのフィールドに文字列でアクセスする。
- 実行時に名前が決まるような場合で、その値が欲しい場合に利用する。
#sh(lua){{
function getfield (f)
    local v = _G
    for w in string.gmatch(f, "[%w_]+") do --文字列strに対して、呼び出されるごとにパターンpatternのキャプチャを順に返すイテレータ関数を返します。
                                           --通常であれば正規表現で「\」を使うところを「%」で記載する。
                                           --パターンにキャプチャが含まれていないときには、イテレータ関数の戻り値はパターンに合致する文字列全体となります。 
        v = v[w]   --> io["read"]とするのだ
    end
    return v
end
 
print( getfield("io.read") )
print( getfield("a.b.c") )
}}


&aname(setfield);
**setfield [#g8214954]
- グローバルのフィールドに文字列でアクセスする。
- 実行時に名前が決まるような場合で、その値をセットしたい場合に利用する。
#sh(lua){{
function setfield (f, v)
    local t = _G
    for w, d in string.gmatch(f, "([%w_]+)(%.?)") do  --通常であれば正規表現で「\」を使うところを「%」で記載する。
         if d == "." then
              t[w] = t[w] or {}                       -- テーブルがなければ作成
              t = t[w]
         else
              t[w] = v                                -- 代入を実行。(もう「.」がなくて最後の要素なので、これはフィールドなので代入する)
         end
    end
end
}}


}}


トップ   差分 履歴 リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS