#lua
#lua
Вопрос:
У меня есть File: data.lua
#! /usr/bin/env lua
local a = {
b = {
c = {
version = "z.y"
},
d = {
version = "z.w"
},
getcversion = function ( self )
print( self.c.version )
end
}
}
Теперь мне нужна функция ‘getcversion ()’..
a.b:getcversion()
Проблема в том, что мне нужно вызвать его извне:
data.lua "a.b:getcversion()"
Я перепробовал все, что мог, но не смог решить эту проблему..
Кто-нибудь знает, как я мог бы вызвать ‘getcversion ()’?
Заранее спасибо, с уважением
Комментарии:
1. Привет, возможно, попробуйте это en.wikibooks.org/wiki/Lua_Programming/command_line_parameter
2. что такое «снаружи»? другой файл Lua?
3. Вне его сценария bash, который вызывает этот файл: data.lua «a.b:getcversion()»
Ответ №1:
Вам нужно будет добавить в свой скрипт что-то вроде следующего:
load(arg[1], "<string>", "t", {a = a})()
load
загрузит содержимое переданного параметра ( arg[1]
) и вернет функцию, которая выполнит этот код в определенной среде (предоставленной в виде {a = a}
таблицы), поскольку вам необходимо передать значения локальных переменных в ваш код (Lua 5.2 ).
Имейте в виду, что это позволит вызывающей стороне передавать произвольный код Lua в ваш скрипт, что может быть проблемой безопасности.
Обработка ошибок оставлена в качестве упражнения для читателя.
Комментарии:
1. Большое спасибо за вашу помощь в этом..
load (chunk [, chunkname [, mode [, env]]])
Это ответ на проблему 🙂 Пока я буду придерживаться:load( arg[1] .. "()", arg[1] .. "()", "t", {a = a} )()
. Благодаря этому я могу вызывать из bash, не экранируя скобки » ()», следующим образом:data.lua a.b:getcversion
Спасибо за вашу помощь!
Ответ №2:
Добавьте return a
в конец data.lua, чтобы превратить его в модуль, а затем:
$ lua -e 'a = require("data"); print(a.b:getcversion())'
z.y
Комментарии:
1. Спасибо за ваш ответ! еще одно решение, о котором я не знал 🙂