LuaJ 在强制 Java 对象中迭代对象数组

Posted

技术标签:

【中文标题】LuaJ 在强制 Java 对象中迭代对象数组【英文标题】:LuaJ Iterate over Object Array in Coerced Java Object 【发布时间】:2020-05-24 01:58:36 【问题描述】:

我正在使用 LuaJ 3.0.1,并且在我的 Lua 脚本中对包含在强制 Java 对象中的数组进行迭代时遇到问题。目前,这就是我正在做的事情:

我有一个包含对象数组的 Java 类。类似的东西

public class Foo 

   public Bar[] bars;


我有一个LuaFunction,它将 Foo 作为其参数之一。我调用这个函数,传递一个 Foo 的实例如下:

luaFunction.invoke(new LuaValue[]
   CoerceJavaToLua.coerce(fooInstance)
);

但是,问题出现在 Lua 脚本本身,我需要遍历 Bar 数组。我尝试使用以下代码,但这会在包含ipairs 函数的行上产生一个带有消息“bad argument: table expected, got userdata”的 org.luaj.vm2.LuaError。

for i,bar in ipairs(fooInstance.bars) do
   ... do stuff with each bar ...
end

Foo 对象被强制转换为 Lua 时,Bar 数组似乎没有变成表格,而是变成了 userdata 类型。因此,它不能传递给ipairs 函数。

有什么办法可以让Bar 数组在 Lua 中被视为表?或者,除了ipairs 之外,还有其他更适合循环遍历数组的选项吗?

【问题讨论】:

local i=0; while fooInstance.bars[i+1] do i=i+1; local bar = fooInstance.bars[i]; ... end @EgorSkriptunoff 谢谢!效果很好 【参考方案1】:

根据 Egor 对我最初问题的评论,解决方案是使用以下代码:

local i = 0
while fooInstance.bars[i+1] do

   i = i + 1
   local bar = fooInstance.bars[i]

   ... do stuff with bar ...

end

【讨论】:

以上是关于LuaJ 在强制 Java 对象中迭代对象数组的主要内容,如果未能解决你的问题,请参考以下文章

Java 小程序在从迭代器数组中删除对象时抛出错误

java中Collection集合Iterator迭代器接口for each循环遍历集合或对象

Java——Collection集合迭代器泛型

如何在 Dojo 中迭代对象(关联数组)?

使用 .map() 在对象 React 中迭代数组

PHP的SPL扩展库对象数组与数组迭代器