LuaJ неправильно передает аргументы командной строки

Я попробовал служебный метод, предоставленный luaj, для вызова файла lua с аргументами командной строки (этот http://lua-users.org/wiki/SourceCodeFormatter)

Globals globals = JsePlatform.standardGlobals();        
String script ="src/codeformatter.lua";
File f = new File(script);
LuaValue chunk = globals.loadfile(f.getCanonicalPath());
List<String> argList = Arrays.asList("--file","test.lua");                          
JsePlatform.luaMain(chunk, argList.toArray(new String[argList.size()]));

Однако я всегда получаю попытку вызвать nil, когда код пытается получить доступ к таблице arg (в то время как i ‹ table.getn(arg) делает) - я пробовал другие примеры, и все они приводят к одной и той же ошибке - luaj, похоже, не устанавливает "arg" корректно - даже простой вывод arg[1] не сработает.


person Steve    schedule 26.11.2015    source источник
comment
Какую версию lua вы используете? table.getn был удален. arg не является именем по умолчанию параметров vararg   -  person hjpotter92    schedule 26.11.2015
comment
Я использую luaj.org/luaj/3.0/README.html, который основан на lua 5.2 - тем не менее - даже args[1] не работает   -  person Steve    schedule 26.11.2015
comment
в начале файла codeformatter поставить local arg = {...} и должно работать.   -  person hjpotter92    schedule 26.11.2015
comment
не помогло, все еще получаю 30 попыток звонка ноль   -  person Steve    schedule 27.11.2015
comment
пожалуйста, имейте в виду, что хотя эталонная реализация REPL предоставляет таблицу _G.arg, стандарт нигде ничего не говорит об этом, поэтому на самом деле нет правильного способа сделать это. просто делайте это так, как вам нравится, и используйте это. часто также есть просто local args={...} в начале файла, но это не работает при загрузке с использованием require   -  person nonchip    schedule 29.11.2015
comment
Хорошо, но это мне не помогает - какие изменения мне нужно сделать, чтобы скрипт с официальной страницы lua работал с LuaJ? Или, если вы знаете, я беру любой другой автоматический форматировщик кода Lua, который я могу использовать в java.   -  person Steve    schedule 29.11.2015
comment
NM - заставил его работать с комбинацией local args={} и заменой getn на #arg заставил его работать - однако средство форматирования кода, похоже, не работает, когда я ожидал - на самом деле ничего не делается   -  person Steve    schedule 29.11.2015


Ответы (2)


LuaJ больше не поддерживает table.getn, потому что он был удален в lua 5.1 - замените все вхождения table.getn на #varname - и инициализируйте массив args с помощью ocal args={...} вверху, чтобы он работал.

Тем не менее, средство форматирования кода на самом деле не делает того, что я ожидал.

person Steve    schedule 29.11.2015

Есть две проблемы:

  • вызовы table.getn(arg) следует заменить на #arg
  • среда чанка не настроена должным образом luaj 3.0.1, поэтому arg не установлен

Однако в качестве обходного пути вы можете захватить входные данные, используя синтаксис varargs "...", добавив строку в начало codeformatter.lua, например

arg = {...}

Вот фрагмент кода для иллюстрации:

Globals globals = JsePlatform.standardGlobals();   
LuaValue chunk = globals.load(
        "arg = {...};" +
        "print(#arg, arg[1], arg[2])");
JsePlatform.luaMain(chunk, new String[] {"--file","test.lua"});

Производит вывод:

2   --file  test.lua
person Jim Roseborough    schedule 23.01.2016