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]

