В нашей библиотеке реализована работа с out&ref посредством стека. При вызове функции с out/ref на стек ложится выходное значение/ссылка. А при создании новой переменной - забирается при наличии.
Это значит, что вы можете вызывать все C# функции, как игры, так и чита, без каких либо ограничений по параметрам в отличии от других API.
Пример с out:
local is_success, output = clr.System.Int32.TryParse("23")
log(is_success)
log(output)
По стандарту функция выглядит так:
public static bool TryParse(string s, out int result)
Вывод: True 23
Пример с ref из C#:
local value = 5
local new_value = clr.lua_lib_tests.main.test_ref(value)
log("value after ref:", new_value)
По стандарту функция выглядит так:
public static void test_ref(ref int value) => value += 1;
Вывод: value after ref: 6
Пример с ref из Lua:
function test_ref_lua(ref value: int)
value = value + 1
end
local value2: int = 3
local result, new_value2 = test_ref_lua(value2)
-- by default func returns LuaResult so we have to make 2 variables.
-- if u wanna remove 1st param u should add ": void"
-- like this: function test_ref_lua(ref value: int) : void
-- local new_value2 = test_ref_lua(value2)
log("value2 after ref:", new_value2)
Вывод: value2 after ref: 4
Также вы можете задавать старой переменной новое значение.
Пример с ref из C#:
local value = 5
value = clr.lua_lib_tests.main.test_ref(value)
log("value after ref:", value)
Вывод: value after ref: 6
Пример с ref из Lua:
function test_ref_lua(ref value) -- we can just put argument name without type
value = value + 1
end
local value2 = 3
local result, value2 = test_ref_lua(value2)
-- by default func returns LuaResult so we have to make 2 variables.
-- if u wanna remove 1st param u should add ": void"
-- like this: function test_ref_lua(ref value) : void
-- value2 = test_ref_lua(value2)
log("value2 after ref:", value2 )