lua_touserdata返回null。

我在尝试获取我的userInfo对象引用时遇到了麻烦。我的一个方法返回该对象的实例。每次调用createUserInfo时,它都会将userInfoObject返回给Lua。

但是,当我从Lua调用userInfo对象的方法时,我无法获取userInfo对象的引用( **lua_touserdata(L,1)**)。

static int getUserName (lua_State *L){
   UserInfo **userInfo = (UserInfo**)lua_touserdata(L,1);

   // The following is throwing null! Need help.
   // Not able to access the userInfo object.
   NSLog(@"UserInfo Object: %@", *userInfo);
}

static const luaL_reg userInstance_methods[] = {
  {"getUserName", getUserName},
  {NULL, NULL}
}

int createUserInfo(lua_State *L){

  UserInfo *userInfo = [[UserInfo alloc] init];
  UserInfoData **userInfoData = (UserInfoData **)lua_newuserdata(L, sizeof(userInfo*));
  *userInfoData = userInfo;

  luaL_openlib(L, "userInstance", userInstance_methods, 0);
  luaL_getmetatable(L, "userInfoMeta");
  lua_setmetatable(L, -2);

return 1;
}

// I have binded newUserInfo to the createUserInfo method.
// I have also created the metatable for this userInfo Object in the init method.
// luaL_newmetatable(L, "userInfoMeta");
// lua_pushstring(L, "__index");
// lua_pushvalue(L, -2);
// lua_settable(L, -3);
// luaL_register(L, NULL, userInstance_methods);

请让我知道是否有遗漏!

我的Lua代码片段:

local library = require('plugin.user')

local userInfo = library.newUserInfo()
print(userInfo.getUserName())

更新 在使用lua_upvalueindex(1)之后,我摆脱了null。这会将引用返回给用户信息实例。

UserInfo **userInfo = (UserInfo**)lua_touserdata(L,lua_upvalueindex( 1 ));

希望对其他人有所帮助!

点赞
用户2279620
用户2279620

我认为可能是你处理 userdata metatable 的方式。具体来说,我认为你从 createUserInfo() 返回的是一个表而不是一个 userdata。我的建议是,在 luaopen 中创建 metatable,然后只需将其设置在新的 userdata 上。类似这样:

int createUserInfo(lua_State *L) {

  UserInfo *userInfo = [[UserInfo alloc] init];
  UserInfoData **userInfoData = (UserInfoData **)lua_newuserdata(L, sizeof(userInfo));
  *userInfoData = userInfo;

  luaL_getmetatable(L, "userInfoMeta");
  lua_setmetatable(L, -2);

  return 1;
}

LUALIB_API int luaopen_XXX(lua_State *L)
{
    luaL_newmetatable(L,"userInfoMeta");
    luaL_openlib(L, NULL, userInstance_methods, 0);
    lua_pushvalue(L, -1);
    lua_setfield(L, -2, "__index");
    ...
2013-09-03 17:06:17
用户393517
用户393517

lua_upvalueindex(1) 已经解决了空值错误。

我想简要地解释一下实际发生的事情。在 C 函数中,会得到传递给该方法的参数栈。Lua 在线文档中有数组的示例,其中所有的方法都使用数组实例的第一个参数。因此,lua_touserdata(L,1) 可以按预期工作,因为第一个参数是数组实例。

Lua.org 上的示例如下:

a = array.new(10) --size 10
array.insert(a, 1, 1) --array.insert(instance, index, value).

在这个示例中,lua_touserdata(L,1) 可以按预期工作,因为第一个参数是数组实例。

但在我的情况下,我是在没有任何参数的情况下调用实例上的方法。因此,在我的 C 函数中,Lua 栈是空的,而 lua_touserdata(L,1) 会出现空值错误。

示例:

a = array.new(10)
a.showValues()  --该方法不是在数组上调用,而是在实例上调用。

因此,为了在 showValues 中访问实例,我需要调用 lua_touserdata(L, lua_upvalueindex(1))。这将返回数组实例对象。

2013-09-04 02:22:33