操作表
假设要为每个窗口配置一种背景色。最终的颜色格式是由三个数字分量组成的 RGB 颜色。它们各自都位于区间0-1之间。
一种直接的方法是要求用户用不同的全局变量设置每个分量:
//配置文件
width = 200
height = 300
background_red = 0.30
background_green = 0.10
background_blue = 0.0
这个方法有两大缺点,第一,太过繁琐。第二,无法预定义常用颜色,如果可以预定义常用颜色,那么用户直接使用 background = WHITE 就好了。为了避免这些缺点,我们将用一张表来表示颜色:
background = {red = 0.30, green = 0.10, blue = 0}
使用表可以让脚本变得更加结构化。用户可以很容易地在配置文件中预定义后面所要使用到的颜色。
BLUE = {red = 0, green = 0, blue = 1.0}
....
background = BLUE
若要在 C 语言中获取这些值,则可使用如下代码
lua_getglobal(L, "background")l
if (!lua_istable(L, -1))
error(L, "'background' is not a table");
red = getcolorfield(L, "red");
green = getcolorfield(L, "green");
blue = getcolorfield(L, "blue");
//getcolorfield的实现
#define MAX_COLOR 255
int getcolorfield(lua_State *L, const char *key) {
int result, isnum;
lua_pushstring(L, key);
lua_gettable(L, -2);
result = (int) (lua_tonumber(L, -1, &isnum) * MAX_COLOR);
if (!isnum)
error(L, "invalid component '%s' in color", key);
lua_pop(L, 1);
return result;
}