我有通过 LuaJava 调用 Lua 的 Java/Scala 代码。我想模仿一些从 J/S 管道到 Lua 管道的对象层次结构;基本上在语言中有伴生对象。换句话说,如果我在 J/S 中创建一个“Cracker”,我将在 Lua 中创建一个“Cracker”对象。然后当我在 J/SI 中调用类似“eatCracker”的方法时,也可以调用 Lua 伴生对象的“eatCracker”。
问题是,我不知道如何创建和存储 Lua 对象,以及如何调用特定对象的方法。
有人能帮忙吗?
当您将对象从 J/S 推送到 Lua 解释器并创建对它的全局引用时,然后运行并访问该对象的 Lua 脚本将访问与 J/S 端相同的对象,而不是它的副本. 因此,一旦脚本结束,Java/Scala 就会看到对象的状态(数据成员)由 Lua 脚本修改。如果 J/S 然后修改它,并且另一个访问该对象的脚本运行,该脚本将看到 J/S 修改的新状态。
所以调用方法时没有模仿:方法是绑定到对象的函数,因此从 Lua 或 Java/Scala 调用它会导致访问相同的对象(相同的内存块)。
但是,在构造的时候需要模仿:如果你用 J/S 构造一个对象,你必须显式地把它推送到 Lua 解释器,它才能变得可用;如果解释器运行的 Lua 脚本创建了一个新对象,J/S 必须拉取它(通过引用该对象的全局变量)。对于处置,我打赌当任何一方(J/S 或 Lua)都没有对它的引用时,该对象将自动完成。
所以你需要做的就是确保你在两个环境中关心的对象在 J/S 端被推和拉(Lua 端是“奴隶”)。我认为自动化这不是一个好主意:仅显式地推/拉双方都需要的东西,不多不少。