gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:15:19 25 4
gpt4 key购买 nike

我有大约 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 中提供一个易于使用的接口(interface)方法来调用这些函数。类似的东西,

DrawShape("CIRCLE", 20)
DrawShape("RECTANGLE", 10, 20)

Lua-C++绑定(bind)代码:

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...

关于c++ - 以 Python 方式调用 Lua 函数,即命名参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38137295/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com