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

Invoking Lua functions the Python way i.e. named arguments

本文关键字:参数 函数 Python 方式 调用 Lua      更新时间:2023-10-16

我有大约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实现这一点?如果没有,我计划对参数字符串进行标记,然后设置各个参数值。

你的反馈会有帮助。多谢。

DrawShape("CIRCLE", Radius=20)

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

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

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

DrawShape{"CIRCLE", Radius=20}

然后您可以使用unpack(t)(假设t是您传递的表参数)获得位置参数,并使用t.Radius或使用pairs迭代获得其余参数。

就我个人而言,我仍然坚持DrawCubeDrawCircle