剑孤寒的小站

人生的价值不是用时间,而是用深度去衡量的!
posts - 75, comments - 290, trackbacks - 0, articles - 0

在Lua中使用枚举型变量

Posted on 2008-10-26 11:07 剑孤寒 阅读(14837) 评论(2)  编辑 收藏 引用 所属分类: Lua
《在Lua中使用枚举型变量》
转载请注明出处:http://groups.google.com/group/jianguhan


用lua来写游戏脚本的确是一件很方便的事情,但是有时候需要用到枚举类型时就有点麻烦了,因为lua里时没有枚举型变量这个东西的,所以要使用枚举还 得自己转换一下,我写了一个函数用来做这种转换:

function CreatEnumTable(tbl, index)
    assert(IsTable(tbl))
    local enumtbl = {}
    local enumindex = index or 0
    for i, v in ipairs(tbl) do
        enumtbl[v] = enumindex + i
    end
    return enumtbl
end

在需要用到枚举变量的地方只要这样用就行了:
EnumTable =
{
    "ET1",
    "ET2",
}

EnumTable = CreatEnumTable(EnumTable )
print(EnumTable.ET1)
print(EnumTable.ET2)

输出为:
1
2

当然,也可以指定下标从多少开始,
比如从10开始,只要把上面创建枚举表的语句换成下面这样就可以了:
EnumTable = CreatEnumTable(EnumTable, 10)

Feedback

# re: 在Lua中使用枚举型变量   回复  更多评论   

2013-08-15 09:32 by liquidmonkey
function enum(t)
local enumtable = {}
local enumindex = 0
local tmp,key,val
for _,v in ipairs(t) do
key,val = string.gmatch(v,"([%w_]+)[%s%c]*=[%s%c]*([%w%p%s]+)%c*")()
if key then
tmp = "return " .. string.gsub(val,"([%w_]+)",function (x) return enumtable[x] and enumtable[x] or (type(_G[x]) == "numbers" and _G[x] or x) end)
enumindex = loadstring(tmp)()
else
key = string.gsub(v,"([%w_]+)","%1");
end
enumtable[key] = enumindex
enumindex = enumindex + 1
end
return enumtable
end
---------------------------------------------------------------------------------------------------

MyGlobalNumber = 10
MyEnum = enum{
"a=1"
"b"
"c=MyGlobalNumber"
"d"
"e=100"
"f"
"g=2^3"
"h"
"i=math.floor(100.001)+MyGlobalNumber*10-100/5"
"j"
}

# re: 在Lua中使用枚举型变量   回复  更多评论   

2013-08-15 10:03 by liquidmonkey
更正:有个地方多余了
tmp = "return " .. string.gsub(val,"([%w_]+)",function (x) return enumtable[x] and enumtable[x] or (type(_G[x]) == "numbers" and _G[x] or x) end)
改成:
tmp = "return " .. string.gsub(val,"([%w_]+)",function (x) return enumtable[x] and enumtable[x] or x end)

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理