使用Python方式调用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)); // 长度
                break;
        case CIRCLE:
                DrawCircle(lua_tointeger(L, -2));  // 半径
                break;
        case RECTANGLE:
                DrawCircle(lua_tointeger(L, -2), lua_tointeger(L, -3)); // 宽度,高度
                break;
                ...
                //对于其他类型也是如此
        default:
                ASSERT(0);
        };
}

initShapeLibrary(lua_State* L)
{
    lua_pushcfunction(L, lua_DrawShape);
    lua_setglobal(L, "DrawShape");
}

我面临的挑战是由于每个函数不需要所有参数,如何使用户更容易指定这些字段?一种方法是记录参数及其顺序,并指望用户遵循它。但这只会导致难以阅读的代码,迫使用户指定不想传递的参数的空值或空字符串。

--第一个参数是半径,第二个未使用。
DrawShape("CIRCLE", 20, -1)

这不友好,我真正想要的是类似Python的一种机制,它允许代码更易读。

DrawShape("CIRCLE", Radius=20)

有没有办法通过Lua实现这个目标?如果没有,我计划对参数字符串进行记号化,然后设置各个参数值。

非常感谢您的反馈。

点赞
用户1442917
用户1442917

你可以传递一个表格,这将允许你区分位置参数和命名参数:

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

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

DrawShape{"CIRCLE", Radius=20}

然后,你可以使用 unpack(t) 来获取位置参数(假设你传递的参数是 t),并使用 t.Radius 获取剩余的参数,或者使用 pairs 迭代它们。

个人而言,我仍然会使用 DrawCubeDrawCircle ...

2016-07-01 05:56:33