【问题标题】:Set methods to lua tables from C/C++/Rust从 C/C++/Rust 设置方法到 lua 表
【发布时间】:2016-02-19 02:40:44
【问题描述】:

我想为某些 lua_State 中的某些表设置额外的“方法”。

状态有这样的代码:

obj = {}

function obj:method1()
    print("value from second method = " .. self.method2())
end

我通过 do_file() 方法加载它。在此之后,我想将 method2() 添加到表 obj 中。这个method2()必须把tableobj(作为self)放到栈中才能正常工作。

我正在尝试这样做:

state.get_global("obj");
if state.is_table(-1) {
   state.push_string("method2");
   state.push_fn(Some(method2));
   state.set_table(-3);
}

或在 C 中:

lua_getglobal(L, "obj");
if (lua_istable(L, -1)) {
    lua_pushstring(L, "method2");
    lua_pushcfunction(L, &lua_method2);
    lua_settable(L, -3);
}

method2() 函数写得很好,与我用于“new_lib”的函数相同,它们运行良好。

当我完成所有这些时,我在 method2() 中检查:

if (lua_istable(L, -1)) {
    // Do some work
} else {
    print("not a table!");
}

我得到“不是一张桌子”而不是实际工作。

我怎么能做这样的事情? Rust(C/C++, 不管) 中的 method2() 是否会将 obj 表 (self) 作为堆栈上的第一个参数?

【问题讨论】:

  • c/c++/rust/没关系....如果你想要一个具体的答案怎么可能没关系?
  • 你试过那个代码了吗?它奏效了吗?如果它不起作用如何它不起作用?爆炸了吗?
  • @tobi303 想必这是一个关于 Lua API 的问题,不管你使用什么编程语言,它或多或少都是一样的。
  • 编辑了问题,添加了更多代码和解释。我希望我做对了。

标签: c lua rust lua-table lua-api


【解决方案1】:

如果您有一个表T 并且您调用T:Func() 并且T.Func 是任何函数,那么T 将是方法调用中的第一个参数。 因此,如果在您的代码中调用obj:method2(),那么obj 将是第一个参数。

请注意,您应该使用 : 运算符调用函数,例如 obj:method2()。如果您使用. 运算符调用它,那么您需要将 obj 表传递给该方法,否则您会遇到您提到的相同的 nil 错误,因为在这种情况下没有传递任何参数。 : 运算符只是 obj.method2(obj) 的语法糖。

我也会尝试使用lua_istable(L, 1),因为参数位于堆栈的底部。如果有人调用obj:method2(2),则该方法将失败,因为堆栈顶部有一个数字值而不是表。 堆栈为函数调用被清除,因此传递的参数始终位于堆栈的最底部。

顺便说一句。在您的 C 代码中,您缺少函数名称的推送。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 2012-05-27
    • 2023-03-20
    • 2010-11-29
    相关资源
    最近更新 更多