Lua - Интеграция C ++: Вызов функции в таблице из C ++

Я не эксперт по Lua, но я написал несколько статей, чтобы понять, как это работает. Однако у меня проблема с вызовом функций lua, принадлежащих таблице из C ++.

В примере, описанном ниже, я пытаюсь вызвать foo: bar из кода. Вызов выполнен. Однако параметр «a» равен нулю (возвращаемое значение правильное - когда я изменю возвращаемое значение, например, на 10, он покажет правильный результат)

Я что-то пропустил при передаче аргументов функции в скрипт?

lua_State* state = LuaIntegration->GetLuaState();
lua_getglobal(state, "foo");
if(lua_istable(state,  lua_gettop(state))) { 
    lua_getfield(state, -1, "bar");
    if(lua_isfunction(state, lua_gettop(state))) { 
        lua_pushinteger(state, 0);
        if (lua_pcall(state, 1, 1, 0) != 0) {
            ErrorMessage = lua_tostring(state, -1);
        }
        ReturnValue = lua_tointeger(state, -1);
    }
}

Он вызывает функцию в lua:

foo = base_foo:new()

function foo:new(o)
      o = o or {}
      setmetatable(o, self)
      self.__index = self
      return o
end

function foo:bar(a) 
  if a==10 then
    return a
  end
  return 0
end

person Norbert Ozdoba    schedule 04.08.2016    source источник


Ответы (1)


Вы забыли сахар в своем вызове C ++.

Если вы прочитали раздел Вызовы функций в руководство по lua вы увидите, что

Вызов v:name(args) является синтаксическим сахаром для v.name(v,args), за исключением того, что v оценивается только один раз.

Это означает, что base_foo:new() на самом деле просто base_foo.new(base_foo).

Это то, чего вам не хватает в вашем вызове C ++.

Вам нужно передать таблицу в качестве первого аргумента функции при ее вызове.

person Etan Reisner    schedule 04.08.2016
comment
Ах, это имеет смысл. Спасибо - person Norbert Ozdoba; 04.08.2016