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]