2015-11-17 8 views
2

Я хочу установить дополнительные «методы» для некоторых таблиц, которые находятся в некотором lua_State.Установить методы для таблиц lua из C/C++/Rust

состояние имеет такой код:

obj = {} 

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

я загрузить его do_file() метода. После этого я хочу добавить метод2() в таблицу obj. Этот метод 2() должен попасть в стек таблицы obj (как 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!"); 
} 

И я получаю «не таблица» вместо реальной работы.

Как я могу это сделать? И будет ли метод2() в Rust (C/C++, независимо) получить obj таблица (self) как первый параметр в стеке?

+5

c/C++/ржавчина/не имеет значения .... как это не имеет значения, если вы хотите получить конкретный ответ? – user463035818

+1

Вы пробовали этот код? Это сработало? Если это не сработало, то как это работает? Он взорвался? –

+0

@ tobi303 Предположительно, это вопрос о Lua API, который более или менее одинаковый независимо от того, на каком языке программирования вы его используете. – Adrian

ответ

2

Если у вас есть таблица T и вы называете T:Func() и T.Func любая функция, то T будет первый параметр в вызове метода. Так что если в коде вы звоните obj:method2(), то obj будет первым параметром.

Обратите внимание, что вы должны вызвать функцию с оператором :, например obj:method2(). Если вы вызываете его с помощью оператора ., вам необходимо передать таблицу obj методу или запустить ту же ошибку nil, о которой вы упоминали, поскольку в этом случае нет аргументов. Оператор : - это просто синтаксический сахар для obj.method2(obj).

Я бы также попытался использовать lua_istable(L, 1), поскольку аргументы находятся в нижней части стека. Если кто-то называет obj:method2(2), тогда метод будет терпеть неудачу, потому что верхняя часть стека имеет числовое значение, а не таблицу. Стек очищается для вызова функции, поэтому переданные аргументы всегда находятся в самом низу стека.

КПП. в вашем C-коде вам не хватает нажатия имени функции.

Смежные вопросы