我有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实现这个的方法?如果没有,我打算对参数字符串进行分词,然后设置各个参数的值。
您的反馈将有所帮助。非常感谢。