Lua Metatables для перехвата вызовов функций

Я пытаюсь использовать Lua Metatables для создания более симпатичного интерфейса с некоторыми внутренними функциями C++.

Вот мой код, который работает до сих пор. (my.get а также my.set реализованы в C++)

function setDefault(t)
  local mt = {
  __index = function(tab,k) return my.get(t,k) end,
  __newindex = function(tab,k,v) return my.set(t,k,v) end
  }
  _G[t] = {}
  setmetatable(_G[t],mt)
end

setDefault("LABEL")

LABEL.Text = "wibble" -- evaluates as my.set("LABEL","Text","wibble")
foo = LABEL.Text -- foo = my.get("LABEL","Text")

Хорошо пока. Следующий бит, который я хочу сделать, это вызовы функций в таблице, например:

LABEL.Flash(500) --must evaluate my.execute("LABEL","Flash", 500)

Я знаю, что это вызывает my.get("LABEL","Flash") - и я могу сделать это вернуть функцию C++ (используя lua_pushcfunction), но когда вызывается функция C++, в ней отсутствуют параметры LABEL и Flash.

Вот фрагмент кода C++ my.get,

static int myGet(lua_State * l)
{
  std::string p1(luaGetString(l, 1)); // table
  std::string p2(luaGetString(l, 2)); // 'method'

  if (isMethod(p1,p2))
  {
    lua_pushcfunction(l, myExec);
    lua_pushvalue(l, 1); // re-push table
    lua_pushvalue(l, 2); // re-push method
    return 3;
  }
  else
  {
  // do my.get stuff here.
  }
}

1 ответ

С небольшим изменением, у меня есть кое-что, что работает: нажмите замыкание C вместо функции C.

  if (isMethod(p1,p2))
  {
    lua_pushvalue(l, 1); // re-push table
    lua_pushvalue(l, 2); // re-push method
    lua_pushcclosure(l, myExecClosure,2);
    return 1;
  }

myExecClosure как myExec, но он читает первые два параметра через значения вверх (например, luaupvaluindex(1)), а не из стековых индексов 1 и 2.

Другие вопросы по тегам