Изменение аргументов Lua в функции C

#c #lua

#c #lua

Вопрос:

Скрипт Lua использует одну из моих функций, определенных на C, как показано ниже:

 function lua_func()

    local var = 5

    -- Do some stuff here, possibly using var.

    c_func(var)

    -- Do other stuff here, that must not use var.

end
  

Эта функция C принимает аргумент, созданный вызывающим, и делает то, что ему нужно.

Этот аргумент функции C должен быть одноразовым, т. Е. После того, как функция C использовала его, я не хочу, чтобы он был доступен для остальной части скрипта Lua.

Я ищу способ для функции C «использовать» этот аргумент. Использовать его, а затем установить его в nil , чтобы он больше не использовался.

Возможно ли это, и если да, то как?

Комментарии:

1. Я не знаю lua, но поддерживает ли он области видимости? Если да, то просто создайте область вокруг того, где следует использовать var.

2. Сценарий Lua не находится под моим контролем. Это предназначено для пользователей, чтобы изменить поведение системы. Итак, я ищу решение на C, которое «аннулирует» переменную сразу после использования.

3. Область действия var контролируется сценарием lua, вы ничего не можете сделать, если не можете изменить сценарий lua. Функция C всегда будет получать копию переменной, в C все передается по значению.

4. Вы могли бы отправить указатель на var, а затем установить для var некоторое недопустимое значение, например -1 или что-то, что имеет смысл в вашем контексте.

5. Lua также передается по значению. Разве это не значение 5, которое вы не хотите использовать снова? Если нет, то нет требования, чтобы аргумент функции имел какое-либо отношение к переменной. Синтаксически аргумент является выражением.

Ответ №1:

Вариант 1:

 function lua_func()

    do
        local var = 5

        -- Do some stuff here, possibly using var.

        c_func(var)
    end

    -- Do other stuff here, that must not use var.

end
  

Вариант 2:

 function lua_func()

    local var_container = {5}

    -- Do some stuff here, possibly using var.

    c_func(var_container)  -- it assigns nil to var_container[1] before exit

    -- Do other stuff here, that must not use var.

end
  

Вариант 3:

 function lua_func()

    local var = 5
    local destructor = function() var = nil end

    -- Do some stuff here, possibly using var.

    c_func(var, destructor)  -- it invokes destructor() before exit

    -- Do other stuff here, that must not use var.

end
  

Комментарии:

1. Вариант Скриптунова 2 кажется наиболее привлекательным для моего случая. Будет ли это работать в случае, если var является lightuserdata? Если да, не могли бы вы, пожалуйста, предоставить мне пример C о том, как C может установить для этого lightuserdata значение NULL?

2. Я имею в виду прямую передачу переменной lightuserdata, а не перенос ее в таблицу.

3. @FotisPanagiotopoulos — Вариант 2 означает, что вы должны перенести свое значение в таблицу.