6

我很难获得我的 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);    

如果我遗漏了什么,请告诉我!

我的 LuaCode 片段:

local library = require('plugin.user')

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

更新 我摆脱了 null,在使用 lua_upvalueindex(1) 之后,这是对用户信息实例的引用。

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

希望它也对其他人有所帮助!

4

2 回答 2

2

我认为这可能是您处理用户数据元表的方式。具体来说,我认为您返回的createUserInfo()是表而不是用户数据。我建议你在 luaopen 中创建一次元表,然后在新的用户数据上设置它。像这样的东西...

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-03T17:06:17.427 回答
0

lua_upvalueindex(1) 修复了 nil 错误。

UserInfo **userInfo = (UserInfo**)lua_touserdata(L,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) 作为第一个参数是数组实例。

就我而言,我在没有任何 params 的情况下通过实例调用该方法。因此,我的 C 函数中的 lua 堆栈是空的,并且 lua_touserdata(L,1) 正在抛出 null。

例子:

a = array.new(10)
a.showValues()  --the method is not over array. it is called on instance.

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

于 2013-09-04T02:22:33.833 回答