Открыть Arrays или ArrayLists в Lua (преобразовать массив в таблицу) - PullRequest
0 голосов
/ 03 мая 2011

Метод в java возвращает массив, и я хочу манипулировать информацией из этого массива в Lua, но кажется, что Lua не конвертирует массивы в таблицы, как я надеялся.

Есть лиспособ сделать это?

Например, у меня есть этот метод в Java:

public Node[] getChildren(){
     return children.toArray(new Node[children.size()]);
}

Когда я вызываю эту функцию из Lua, я ничего не могу с ней поделать или должен ее инстанцировать,повторить его и скопировать все в Lua-Table, а затем использовать его.Есть ли способ преобразовать массив в Lua-Table в Java, а затем вернуть его?

РЕДАКТИРОВАТЬ: я использую LuaJ и библиотеку LuaJava.

1 Ответ

3 голосов
/ 24 мая 2011

Из руководства LuaJava кажется, что вы должны манипулировать прокси-объектами, возвращаемыми Java, используя их методы Java (используя синтаксис двоеточия Lua для объектно-ориентированных вызовов, т.е. my_proxy_array_list:get(5)).

Он не описывает никакой встроенной трансляции массивов в таблицы, поэтому, если вам нужно построить таблицу из массива Java (скажем, потому что вы хотите запустить функцию из Lua *)1008 * библиотеки), вам придется перебирать массив (используя для этого свои знания Java) и помещать значение каждого индекса массива в соответствующий индекс таблицы.

Если, однако,вам просто нужно что-то, что работает как таблица Lua, вы можете сделать что-то в Lua с помощью метатаблицы с функциями, которые преобразуют __index и __newindex в соответствующие методы Java (вероятно, get и * 1016).*), вот так:

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 и получить обратно объект, который вы можете индексировать с помощью оператора индекса:

local indexable = wrap_lj_proxy(myAL)
print(indexable[5]) -- equivalent to myAL:get(5)
...