Lua:简洁地表达表的范围

我正在制作一个游戏,在游戏中会根据项目或外部通过模组文件定义的一些限制条件动态生成一些角色。我使用 MoonSharp Lua(5.2)解释器与我的 C # 代码进行交互,使用 Lua 表来存储约束预设。作为一个例子:

require "Defaults"
AgePresets = {}

-- 单个值
AgePresets.Newborn = 0

-- 简单的范围
AgePresets.Default = defaultAgeRange --指的是 Defaults require
AgePresets.Child = {1, 12}
AgePresets.Teenager = {13, 19}
AgePresets.YoungAdult = {20, 29}
AgePresets.Adult = {30, 40}
AgePresets.MiddleAge = {40, 60}
AgePresets.Senior = {61, 80}
AgePresets.Elder = {81, 99}
AgePresets.Methuselah = {100, 150}
AgePresets.Methuselah2 = {150, 200}

-- 加权范围 // 再次引用先前定义的元素来保持简洁
AgePresets.Tween = {
            {weight = 1, minmax = AgePresets.Teenager },
            {weight = 1, minmax = AgePresets.YoungAdult }
         }

这个做法可以,但是从最终用户的角度来看,涉及到很多不必要的输入。我们在这里显然是在处理 AgePresets,但仍然在每个成员名称之前都需要添加前缀。

我当然可以像 AgePresets = { Child = {},Teenager = {} } 一样将 AgePresets 定义为数组,但这样的问题是我不能引用数组中先前定义的元素。

这不起作用:

AgePresets = {
    Child = {1,12},
    RefToChild = Child, //尝试索引空值异常
    Teen = {13,19}
}

我希望实现的理想情况是以整洁、简洁的方式让用户输入数据,就像第一个例子一样,但不必在每个成员之前都加上 AgePresets 前缀。我该如何在文件中声明作用域,以使在该作用域中定义的所有后续成员均位于该作用域内,同时保持对先前在作用域中定义的其他成员的引用能力?

点赞
用户1847592
用户1847592
AgePresets = setmetatable({}, {__index = _G})

-- 定义年龄范围
do
   local _ENV = AgePresets
   Newborn = 0
   Child = {1,12}
   RefToChild = Child -- 这个引用是正确的
   Teen = {13,19}
   YoungAdult = {20,29}
   Tween = {
      {weight = 1, minmax = Teen },
      {weight = 1, minmax = YoungAdult }
   }
   rnd = math.random(10)   -- 全局函数在这里可用
end

setmetatable(AgePresets, nil)
2017-06-20 21:36:00
用户2226988
用户2226988

可以 混合使用这两种风格:对于不需要引用作用域外变量的字段,可以使用表构造器,然后使用赋值语句处理其它的字段。

除非在代码中,字段的顺序显著提高了理解能力,否则我会这样做。

2017-06-22 22:33:04