Открыть Arrays или ArrayLists в Lua (преобразовать массив в таблицу)
Метод в java возвращает массив, и я хочу манипулировать информацией из этого массива в Lua, но кажется, что Lua не конвертирует массивы в таблицы, как я надеялся.
Есть ли способ сделать это?
Например, у меня есть этот метод в Java:
public Node[] getChildren(){
return children.toArray(new Node[children.size()]);
}
Когда я вызываю эту функцию из Lua, я ничего не могу с ней поделать или вынужден ее инстанцировать, итерировать через нее и копировать все в Lua-Table, а затем использовать ее. Есть ли способ преобразовать массив в Lua-таблицы в Java, а затем вернуть его?
РЕДАКТИРОВАТЬ: я использую LuaJ и библиотеку LuaJava.
1 ответ
Из руководства LuaJava видно, что вы должны манипулировать прокси-объектами, возвращаемыми Java, используя их методы Java (используя синтаксис двоеточия Lua для объектно-ориентированных вызовов, т.е. my_proxy_array_list:get(5)
).
Он не описывает никакой встроенной трансляции массивов в таблицы, поэтому, если вам нужно построить таблицу из массива Java (скажем, потому что вы хотите запустить функцию из Lua table
библиотека), вам придется перебирать массив (используя для этого свои знания Java) и помещать значение каждого индекса массива в соответствующий индекс таблицы.
Однако, если вам просто нужно что-то, что работает как таблица Lua, вы можете сделать что-то в Lua с помощью метатаблицы с функциями, которые переводят __index
а также __newindex
в соответствующие методы Java (возможно, get
а также set
), как это:
local wrap_lj_proxy; do
local proxy_mt = {}
function proxy_mt:__index(k)
return self.proxy:get(k)
end
function proxy_mt:__newindex(k,v)
return self.proxy:set(k,v)
end
function wrap_lj_proxy (proxy)
return setmetatable({proxy=proxy},proxy_mt)
end
end
С вышеупомянутым вы можете позвонить wrap_lj_proxy
с вашим ArrayList и получить обратно объект, который вы можете индексировать с помощью оператора index:
local indexable = wrap_lj_proxy(myAL)
print(indexable[5]) -- equivalent to myAL:get(5)