我有大约50多个C ++函数接受修复数量的参数说25+。将这些参数视为数据结构中的成员。
每个函数都实现了一个业务逻辑,它可能需要也可能不需要读取/检查所有25个参数的值。因此,某些功能可能只对2个值感兴趣,而其他具有多个检查的功能可能会查找15 +。
一些示例函数如下:
C ++
void DrawSegment(int length);
void DrawCircle(int radius);
void DrawRectangle(int width, int height);
void DrawCube(int side);
我的任务是在Lua中提供一个易于使用的接口方法来调用这些函数。像,
DrawShape("CIRCLE", 20)
DrawShape("RECTANGLE", 10, 20)
Lua-C ++绑定代码:
enum TYPE{SEGMENT, CIRCLE, RECTANGLE, CUBE};
lua_Integer MapStringToEnum(const char*);
int lua_DrawShape(lua_State*L)
{
lua_Integer type = MapStringToEnum(lua_tointeger(L, -1));
switch (type)
{
case SEGMENT:
DrawSegment(lua_tointeger(L, -2)); // length
break;
case CIRCLE:
DrawCircle(lua_tointeger(L, -2)); // radius
break;
case RECTANGLE:
DrawCircle(lua_tointeger(L, -2), lua_tointeger(L, -3)); // width, height
break;
...
//and so on for other types
default:
ASSERT(0);
};
}
initShapeLibrary(lua_State* L)
{
lua_pushcfunction(L, lua_DrawShape);
lua_setglobal(L, "DrawShape");
}
我面临的挑战是因为每个函数都不需要所有参数,如何让用户更容易指定这些字段?一种方法是记录参数及其顺序,并期望用户遵循它。但这只会导致一个不可读的代码,迫使用户为他不打算传递的参数指定空值或空字符串。
-- 1st argument is radius, 2nd unused.
DrawShape("CIRCLE", 20, -1)
这不是代码友好的。我真正喜欢的是类似Python的工具,它允许代码可读。
DrawShape("CIRCLE", Radius=20)
无论如何通过Lua实现这一目标?如果没有,我打算将参数字符串标记,然后设置各个参数值。
您的反馈会有所帮助。非常感谢。
答案 0 :(得分:3)
DrawShape("CIRCLE", Radius=20)
您可以传递一个表格,这样您就可以区分位置参数和命名参数:
DrawShape({"CIRCLE", Radius=20})
你也可以使用语法糖,在这种情况下你可以删除一对圆括号:
DrawShape{"CIRCLE", Radius=20}
然后,您可以使用unpack(t)
获取位置参数(假设t
是您传递的表参数)并使用t.Radius
获取其余参数或使用{{1}迭代它们}}
就个人而言,我仍然坚持pairs
和DrawCube
......