1

.lua ファイルで定義されているすべての関数パラメーターの数と名前を取得する方法はありますか?

たとえば、私のtest1.luaは

function MyAdd( num1, num2, num3)
    local x = 0
    if(num1 <= num2) then
        x = num1 + num2 + num3 
    else
        x = (num1 - num2) + num3     
    end
    return x
end

Java クラス内では、パラメーター値を渡してこの関数を実行しようとしています。

この Lua 関数が他のユーザーによって作成され、フォルダーに保存され、Java アプリケーションがこの Lua ファイルをその中にある関数を知らずにロードした場合。関数の名前(「MyAdd」)、この関数への入力パラメータの数、およびJava内のこれらの入力パラメータの名前(num1、num2、およびnum3)を取得するにはどうすればよいですか

関数の名前と入力パラメーターの数と順序がわかっている場合は、次のように関数を呼び出すことができます。

public static void main(String[] args) {

    int a1 = 5;
    int a2 = 10;
    int a3 = 15;

    Globals globals = JsePlatform.standardGlobals();
    globals.get("dofile").call(LuaValue.valueOf("./luascripts/test1.lua"));

        LuaValue MyAdd = globals.get("MyAdd"); 

        Varargs results = MyAdd.invoke(LuaValue.varargsOf(new LuaValue 
             [] {LuaValue.valueOf(a3), LuaValue.valueOf(a1), LuaValue.valueOf
                 (a2)}));
        System.out.println(results);
}

私が何を達成しようとしているのかを明確にしていただければ幸いです。どんな助けでも大歓迎です。

4

1 に答える 1

0

直接的な方法はないと思うので、これが私がとったアプローチでした。

問題のケースにのみ固有のソル。

1) .lua ファイルの内容を文字列に読み取る 2) 文字列に文字列 "function" が含まれているかどうかを確認する 3) 関数名のインデックスを検索する 4) '(' と ')' のインデックスを検索する 5) インデックス間のパラメーターを取得する部分文字列としてステップ 4 から。6) ',' が発生したときに部分文字列を分割し、文字列配列に保存します。

    String FnctionName = null;
    String[] par_array = null;
    try {
        String contents = new String(Files.readAllBytes(Paths.get("./luascripts/test1.lua")));
        if ( contents.contains("function") ) {

            int space = contents.indexOf(" ");
            int left_br = contents.indexOf("(");
            int right_br = contents.indexOf(")");
            FnctionName = contents.substring(space + 1, left_br);
            String params = contents.substring(left_br + 1, right_br);

            par_array = params.replaceAll("\\s+", "").split(",");

            System.out.println(FnctionName);               
            for ( String s : par_array ) {
                System.out.println(s);
            }
       }
    } catch ( IOException e ) {
        e.printStackTrace();
    }
于 2016-10-07T12:30:52.283 に答える