В настоящее время я работаю над проектом с LuaJ, библиотекой, которая позволяет Java интерпретировать код Lua и выполнять его. Из того, что я до сих пор собирал, я могу передать только те значения, которые может понять сам Lua, такие как примитивы, таблицы, пользовательские данные и т. Д.
Я не могу найти, например, способ вызова функции, определенной в Lua, путем передачи ссылки на объект в качестве аргумента.
И это имеет смысл. Lua не может понять ссылки на объекты Java, это справедливо.
Решением, которое я придумал, было создание менеджера виртуальной памяти. В простейшей реализации, которую я могу придумать, это, по сути, будет Map<Integer,Object>
. Бит Integer используется в скриптах Lua, что-то вроде doSomethingWithObject(object)
, где объект на самом деле является LuaValue ключа Integer из карты.
Когда вызывается doSomethingWithObject(object)
(а это функция, определенная в Java, расширенная с OneArgFunction
), она должна подключиться к Map<Integer,Object>
, извлечь объект, представленный целочисленным значением, и делать все, что захочет с объектом.
Это имеет запах. Я не уверен, есть ли лучшие способы сделать это. Если таковые имеются, я хотел бы прочитать любую информацию, которую смогу получить.