调用Lua函数是Python方式,即命名参数

时间:2016-07-01 04:52:12

标签: c++ lua

我有大约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实现这一目标?如果没有,我打算将参数字符串标记,然后设置各个参数值​​。

您的反馈会有所帮助。非常感谢。

1 个答案:

答案 0 :(得分:3)

  

DrawShape("CIRCLE", Radius=20)

您可以传递一个表格,这样您就可以区分位置参数和命名参数:

DrawShape({"CIRCLE", Radius=20})

你也可以使用语法糖,在这种情况下你可以删除一对圆括号:

DrawShape{"CIRCLE", Radius=20}

然后,您可以使用unpack(t)获取位置参数(假设t是您传递的表参数)并使用t.Radius获取其余参数或使用{{1}迭代它们}}

就个人而言,我仍然坚持pairsDrawCube ......