Почему loadstring не видит локальные переменные?

Shishkin

Известный
Автор темы
488
249
Версия MoonLoader
.026-beta
Не могу понять - как красиво пофиксить эту проблему. Функция loadstring - не видит локальные переменные. Под локальными переменными я имею ввиду то, что когда моя функция получает переменную и я вписываю её для дополнительной обработки в loadstring, то он её не видит. Но при этом если я перезапишу эту локальную переменную в глобальную - увидит. Как это пофиксить или красивее всего исправить?
Пример моего уродливого, но рабочего способа

Lua:
function gavnocod(asd)
    dsa = asd
    loadstring("print dsa")(dsa) -- выдаст переменную asd
end
 
Последнее редактирование:
Решение
В loadstring можно передать нужные переменные.
Lua:
function loadCodeWithParams(strcode, params)
  local ctx = {}
  setmetatable(ctx, { __index = _G })
  local mt = getmetatable(ctx)
  for k, v in pairs(params) do mt.__index[k] = v end
  local fn = assert(loadstring(strcode))
  setfenv(fn, ctx)
  return fn
end

Lua:
function gavnocod(asd)
    dsa = asd
    loadCodeWithParams("print(dsa)", { dsa--[[ключ должен иметь название используемой в loadstring переменной]] = dsa })()
end

.KOHTOP.

Активный
217
35
Не могу понять - как красиво пофиксить эту проблему. Функция loadstring - не видит локальные переменные. Под локальными переменными я имею ввиду то, что когда моя функция получает переменную и я вписываю её для дополнительной обработки её в loadstring, то он её не видит. Но при этом если я перезапишу эту локальную переменную в глобальную - увидит. Как это пофиксить или красивее всего исправить?
Пример моего уродливого, но рабочего способа

Lua:
function gavnocod(asd)
    dsa = asd
    loadstring("print dsa")(dsa) -- выдаст переменную asd
end
попробуй
loadstring("print" .. dsa)
 

Andrinall

Известный
680
532
В loadstring можно передать нужные переменные.
Lua:
function loadCodeWithParams(strcode, params)
  local ctx = {}
  setmetatable(ctx, { __index = _G })
  local mt = getmetatable(ctx)
  for k, v in pairs(params) do mt.__index[k] = v end
  local fn = assert(loadstring(strcode))
  setfenv(fn, ctx)
  return fn
end

Lua:
function gavnocod(asd)
    dsa = asd
    loadCodeWithParams("print(dsa)", { dsa--[[ключ должен иметь название используемой в loadstring переменной]] = dsa })()
end
 
  • Нравится
Реакции: Shishkin и arpix