Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
LuaJava:使用LuaJava将整个Lua表导入类Java数组_Java_Arrays_Lua_Lua Table_Luajava - Fatal编程技术网

LuaJava:使用LuaJava将整个Lua表导入类Java数组

LuaJava:使用LuaJava将整个Lua表导入类Java数组,java,arrays,lua,lua-table,luajava,Java,Arrays,Lua,Lua Table,Luajava,我真的被困在这里了,搜索了我的谷歌屁股,试图用luajava将一个表从lua“导入”到java中的一个数组。。。 现在,我已经能够做一些简单的事情,用java打印lua变量,并从表中读取单个元素。。这里一切正常 JAVA LuaState L = LuaStateFactory.newLuaState(); L.openLibs(); L.LdoFile("data/test.lua"); L.getGlobal("x"); //I want to read lua-variable x Lua

我真的被困在这里了,搜索了我的谷歌屁股,试图用luajava将一个表从lua“导入”到java中的一个数组。。。 现在,我已经能够做一些简单的事情,用java打印lua变量,并从表中读取单个元素。。这里一切正常

JAVA

LuaState L = LuaStateFactory.newLuaState();
L.openLibs();
L.LdoFile("data/test.lua");
L.getGlobal("x"); //I want to read lua-variable x
LuaObject obj = L.getLuaObject(L.getTop()); //So I get the top-element here
System.out.println(obj.getField("Version")); 
LUA

    x = { ["Version"] = 1.3,["Scans"] = 3 }
现在,检索单个值显然相当容易,但我想将整个对象转换成Java(作为数组或其他任何形式),这样我就可以用它做一些事情了。。 我试着通过LuaObject循环,但由于它还不是iterable或“真实”数组,所以这是不可能的。。 只需输出
obj
就会告诉我这是一个lua表,我用.getObject尝试了很多愚蠢的东西,没有成功。然后我读了一些关于proxies和.pcall的内容(这看起来像是将Java中的值传递给lua中的函数,这不是我想要的) 在(非常糟糕的)文档化javadoc中找不到任何东西,所以我希望有人对此有经验。。可能真的很简单,但很难找到相关信息。 真的很高兴有关于这个的任何信息


p、 我无法更改原始lua文件(稍后),但该文件将只包含一个大表。

lua是一种动态语言,表是其唯一的数据结构。表可以包含键/值对的任意组合,这与Java的静态类型不同。因此,您需要创建一个转换函数,该函数将从Lua表创建Java对象。这不是LuaJava自动提供的

如果要使用从Lua表中获取的数据填充Java类,基本上有以下选项:

  • 手动执行(最简单)创建一个简单函数,该函数采用Lua堆栈索引,在该索引处需要一个Lua表,然后创建POD类的Java实例并手动填充数据,即需要键入所有必需的
    getField
    调用

  • 使用Java反射(更通用)-转换函数采用Lua堆栈索引和Java
    ,创建该类的新实例,并与一起使用以迭代Lua表并填写必要的Java字段


  • 如果您只打算在一种类型的Lua表上使用转换,我建议您使用第一个选项。缺点是每次更改结构时,都必须更新转换代码。第二种方法也有缺点,例如,您应该如何处理缺少/额外键、子表等情况。

    Lua是一种动态语言,表是它唯一的数据结构。表可以包含键/值对的任意组合,这与Java的静态类型不同。因此,您需要创建一个转换函数,该函数将从Lua表创建Java对象。这不是LuaJava自动提供的

    如果要使用从Lua表中获取的数据填充Java类,基本上有以下选项:

  • 手动执行(最简单)创建一个简单函数,该函数采用Lua堆栈索引,在该索引处需要一个Lua表,然后创建POD类的Java实例并手动填充数据,即需要键入所有必需的
    getField
    调用

  • 使用Java反射(更通用)-转换函数采用Lua堆栈索引和Java
    ,创建该类的新实例,并与一起使用以迭代Lua表并填写必要的Java字段


  • 如果您只打算在一种类型的Lua表上使用转换,我建议您使用第一个选项。缺点是每次更改结构时,都必须更新转换代码。第二种方法也有缺点,例如,您应该如何处理缺少/额外键、子表等情况。

    好的,到目前为止,这似乎有点超出我的理解,但我会尝试一下。。因此,由于我的lua表是动态的(其中有用户名),我不能使用getField访问它们,所以1。我猜这不是一个选择?!反射对我来说是全新的,乍一看有点太复杂了。。我会尝试使用LdoString,让lua中的一个循环填充我从java发送的一个表,不知道这是否可行,但我会尝试一下。。不过谢谢你的回复,也许我可以比我想象的更容易进行反思,我们拭目以待;)Java反射不是微不足道的。我所说的“手动”是指你应该像这样写出所有的作业:
    datad=newdata();L.getField(idx,“名称”);d、 名称=L.toString(L,-1);L.getField(idx,“版本”);d、 version=L.toString(L,-1)之后别忘了清理Lua堆栈:)好吧,那我就不反思了;)但是如果我不知道这些名字是什么,我就无法用getField检索它们。。表总是有相同的名称,但项目是用户名和服务器,我不知道它们到底是什么。。第一行始终为“版本”,第二行始终为“扫描”,但在扫描中,它将存储我在执行时未知的服务器名称。。那么,有什么解决方案吗?顺便说一句,它嵌套在扫描中好几次,我不知道其中任何数据的名称,只是它的外观。好的,到目前为止,这似乎有点超出我的理解,但我会尝试一下。。因此,由于我的lua表是动态的(其中有用户名),我不能使用getField访问它们,所以1。我猜这不是一个选择?!反射对我来说是全新的,乍一看有点太复杂了。。我会尝试使用LdoString,让lua中的一个循环填充我从java发送的一个表,不知道这是否可行,但我会尝试一下。。不过谢谢你的回复,也许我可以比我想象的更容易进行反思,我们拭目以待;)Java反射不是微不足道的。我的意思是