Luaで良く作る文法 ~変数編~

enum

  • enum.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
    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.
    

getfield

  • グローバルのフィールドに文字列でアクセスする。
  • 実行時に名前が決まるような場合で、その値が欲しい場合に利用する。
    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") )
    

setfield

  • グローバルのフィールドに文字列でアクセスする。
  • 実行時に名前が決まるような場合で、その値をセットしたい場合に利用する。
    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
Last-modified: 2016-01-23 (土) 00:00:00