以Python方式调用Lua函数,即命名参数
Invoking Lua functions the Python way i.e. named arguments
我有大约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
迭代获得其余参数。
就我个人而言,我仍然坚持DrawCube
和DrawCircle
…
相关文章:
- 将可变参数函数的参数封装在类实例中
- QML 使用带有参数C++函数
- 使用可变参数函数作为模板参数
- 如何在C++中伪造虚拟可变参数函数模板?
- 为什么可变参数函数不适用于模板
- C++ std::functional 中的可变参数函数模板
- 可变参数函数指针的定义对于VxWorks spyLib来说不清楚
- 使用可变参数函数覆盖具有不同函数签名的虚函数
- 考虑引用和常量的可变参数函数包装器
- 使用可变参数函数将整数和/或整数数组放入单个 int 数组中
- 在可变参数函数中转发特定范围的参数
- 通过引用传递参数;函数返回类型是否必须为 VOID?
- 使用带有一个参数函数的递归找到数字的平方
- 可变参数函数模板不能很好地使用 std::function 作为参数
- 多个可变参数函数的单个模板参数包?
- 参数数据类型未知的可变参数函数
- 可变参数函数参数包扩展
- 使用模板可变参数函数将多个参数传递给另一个函数
- 对可变参数函数的递归调用的链接器错误
- 通过像printf这样的可变参数函数传递一个带有常量字符*转换函数的类