Открыть 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)
Другие вопросы по тегам