LuaJで配列、連想配列(テーブル)を使用する方法

LuaJは難しい

JavaにLuaを組み込むためのLuaJですが、ドキュメントがそろってなくて、とても扱いが難しいものです。簡単な関数をJava側で定義してLua側とやり取りすることは容易にできますが、それに配列をやり取りできるようにしようとすると、どこにも方法が書いてなかったりします。ここでは、試行錯誤の上で成功した方法を書いておきます。これを使えば、かなり複雑な機能も実装することができます。

Java側のソース

package jp.co.test.lua;

import java.util.ArrayList;

import org.luaj.vm2.Globals;
import org.luaj.vm2.LuaTable;
import org.luaj.vm2.LuaValue;
import org.luaj.vm2.Varargs;
import org.luaj.vm2.lib.OneArgFunction;
import org.luaj.vm2.lib.jse.CoerceJavaToLua;
import org.luaj.vm2.lib.jse.JsePlatform;

public class LuaTest {

    // 配列
    public class ArrayFunc extends OneArgFunction {
    	public LuaValue call(LuaValue objects) {
    		// 引数から配列を取得
    		LuaTable luaTable = objects.checktable();
			for (int i = 0; i < luaTable.length(); i++) {
				System.out.println("[" + luaTable.get(i + 1).toString() + "]");
			}

			// 配列データを返す
			LuaTable retTable = new LuaTable();
			retTable.insert(retTable.length() + 1, LuaValue.valueOf("あいうえお"));
			retTable.insert(retTable.length() + 1, LuaValue.valueOf("かきくけこ"));
			retTable.insert(retTable.length() + 1, LuaValue.valueOf("さしすせそ"));
			return retTable;
    	}
    }

    // 連想配列
    public class MapFunc extends OneArgFunction {
    	public LuaValue call(LuaValue objects) {
    		// 引数から連想配列を取得
    		LuaTable luaTable = objects.checktable();
    		for (int i = 0; i < luaTable.keyCount(); i++) {
    			String key   = luaTable.keys()[i].toString();
    			String value = luaTable.get(luaTable.keys()[i]).toString();
    			System.out.println("[" + key + "]=[" + value + "]");
    		}

    		// 連想配列を返す
			LuaTable retTable = new LuaTable(0,30);
			retTable.set(LuaValue.valueOf("ntt"), LuaValue.valueOf("docomo"));
			retTable.set(LuaValue.valueOf("abc"), LuaValue.valueOf("def"));
			return retTable;
    	}
    }

    // コンストラクタ
    public LuaTest() {
        Globals globals = JsePlatform.standardGlobals();
        globals.set("ArrayFunc", new ArrayFunc());
        globals.set("MapFunc", new MapFunc());
        globals.set("high", 13000); // 変数を先にセットしておく場合
        globals.loadfile("logic.lua").call();
    }

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new LuaTest();
	}

}

Lua側のソース

tbl = {"あ", "い", "う"}
ret = ArrayFunc(tbl)
for i, data in ipairs(ret) do
  print("[" .. i .. "]=[" .. data .. "]")
end
tbl = {}
tbl["東京"]="関東地方"
tbl["大阪"]="近畿地方"
ret = MapFunc(tbl)
for key, value in pairs(ret) do
  print("[" .. key .. "]=[" .. value .. "]")
end

実行結果

[あ]
[い]
[う]
[1]=[あいうえお]
[2]=[かきくけこ]
[3]=[さしすせそ]
[東京]=[関東地方]
[大阪]=[近畿地方]
[abc]=[def]
[ntt]=[docomo]

特集記事

Posted by @erestage