Lua:table范围的简明表达
Lua: Concise expression of table scope
我正在开发一款游戏,其中会根据项目中或通过 mod 文件在外部定义的一些约束动态生成一堆角色。我正在使用 MoonSharp Lua (5.2) 解释器与我的 C# 代码进行交互,并使用 Lua 表来存储约束预设。例如:
require "Defaults"
AgePresets = {}
-- Single value
AgePresets.Newborn = 0
-- Simple ranges
AgePresets.Default = defaultAgeRange --referring to the 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}
-- Weighted ranges // again referring to previously defined elements to keep things concise
AgePresets.Tween = {
{weight = 1, minmax = AgePresets.Teenager },
{weight = 1, minmax = AgePresets.YoungAdult }
}
这工作正常,但从最终用户的角度来看,涉及很多不必要的输入。我们显然正在处理 AgePresets,但它仍然作为每个成员名称前的前缀被提及。
我当然可以将 AgePresets 定义为数组,例如 AgePresets = { Child = {}, Teenager = {} } 但问题是我无法引用数组中先前定义的元素。
这不起作用:
AgePresets = {
Child = {1,12},
RefToChild = Child, //attempt to index a nil value exception
Teen = {13,19}
}
我理想中想要实现的是一种简洁明了的方式让用户输入这些数据,就像在第一个示例中一样,但不必放置 AgePresets。一切之前的前缀。我如何着手在文件中声明一个范围,以便文件中定义的所有后续成员都在该范围内,同时保持引用先前在该范围中定义的其他成员的能力?
AgePresets = setmetatable({}, {__index = _G})
do
local _ENV = AgePresets
Newborn = 0
Child = {1,12}
RefToChild = Child -- this ref is Ok
Teen = {13,19}
YoungAdult = {20,29}
Tween = {
{weight = 1, minmax = Teen },
{weight = 1, minmax = YoungAdult }
}
rnd = math.random(10) -- global functions are available here
end
setmetatable(AgePresets, nil)
您可以混合两种样式:table 不需要引用尚不在范围内的变量的字段的构造函数,后跟赋值语句剩下的。
除非代码中字段的顺序显着增强了理解力,否则我会这样做。
我正在开发一款游戏,其中会根据项目中或通过 mod 文件在外部定义的一些约束动态生成一堆角色。我正在使用 MoonSharp Lua (5.2) 解释器与我的 C# 代码进行交互,并使用 Lua 表来存储约束预设。例如:
require "Defaults"
AgePresets = {}
-- Single value
AgePresets.Newborn = 0
-- Simple ranges
AgePresets.Default = defaultAgeRange --referring to the 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}
-- Weighted ranges // again referring to previously defined elements to keep things concise
AgePresets.Tween = {
{weight = 1, minmax = AgePresets.Teenager },
{weight = 1, minmax = AgePresets.YoungAdult }
}
这工作正常,但从最终用户的角度来看,涉及很多不必要的输入。我们显然正在处理 AgePresets,但它仍然作为每个成员名称前的前缀被提及。
我当然可以将 AgePresets 定义为数组,例如 AgePresets = { Child = {}, Teenager = {} } 但问题是我无法引用数组中先前定义的元素。
这不起作用:
AgePresets = {
Child = {1,12},
RefToChild = Child, //attempt to index a nil value exception
Teen = {13,19}
}
我理想中想要实现的是一种简洁明了的方式让用户输入这些数据,就像在第一个示例中一样,但不必放置 AgePresets。一切之前的前缀。我如何着手在文件中声明一个范围,以便文件中定义的所有后续成员都在该范围内,同时保持引用先前在该范围中定义的其他成员的能力?
AgePresets = setmetatable({}, {__index = _G})
do
local _ENV = AgePresets
Newborn = 0
Child = {1,12}
RefToChild = Child -- this ref is Ok
Teen = {13,19}
YoungAdult = {20,29}
Tween = {
{weight = 1, minmax = Teen },
{weight = 1, minmax = YoungAdult }
}
rnd = math.random(10) -- global functions are available here
end
setmetatable(AgePresets, nil)
您可以混合两种样式:table 不需要引用尚不在范围内的变量的字段的构造函数,后跟赋值语句剩下的。
除非代码中字段的顺序显着增强了理解力,否则我会这样做。