如何将对象传递给公开的 luaj 函数?

2023-11-22

我正在尝试使用 Luaj + java 构建一个控制器。我有以下java类

public class Duck {
  public void talk() { System.out.println("Duck quacks!"); }
  public void walk() { System.out.println("Duck walks!"); }
}

public class Person {
  public void talk() { System.out.println("Person talks!"); }
  public void walk() { System.out.println("Person walks!"); }
}

以及控制器的以下 lua 脚本:

onTalk(obj) 
  obj:talk();
end

onWalk(obj)
   obj:walk();
end

理想情况下,我希望定义一个控制器(用 lua 编写),在其中保留程序的所有逻辑,并且我希望将该控制器的 API 公开给我的 java 代码。我试图使用以下方法:

ScriptEngineManager sem     = new ScriptEngineManager();
ScriptEngine        engine  = sem.getEngineByExtension(".lua");
ScriptEngineFactory factory = engine.getFactory();

// Script defined above
CompiledScript cs = ((Compilable)engine).compile(MY_LUA_SCRIPT);
SimpleBindings b = new SimpleBindings();

b = newSimpletBindings();

LuaValue onWalkHandler = (LuaValue)b.get("onWalk");
//func.call(LuaValue.valueOf(duck)); // Passing duck object does not work ???

我无法将对象传递给 LuaValue。如何将java对象传递给lua脚本?

PS:一般来说,当使用 Java 和嵌入式脚本时,人们是将函数捆绑在一个脚本中,还是每个回调都有一个单独的脚本?


我在寻找luaj条目并发现您未得到答复。你的问题很有趣,让我开始搜索。然后我意识到这是两年前问的……我希望我的回答对其他人有用!代码基于luaj-3.0-alpha1。

我们需要一个有效的 Lua 脚本(你忘记了function关键词):

function onTalk(javaObj)
  print(type(javaObj) .. " " .. tostring(javaObj))
  print(javaObj.name)
  javaObj:talk()
  return true
end

function onWalk(javaObj)
  javaObj:walk()
  return 1, "km"
end

我添加了一点痕迹... 我也制作了与你类似的课程:

class Dog
{
  public String name;
  Dog(String n) { name = n; }
  public void talk() { System.out.println("Dog " + name + " barks!"); }
  public void walk() { System.out.println("Dog " + name + " walks..."); }
}
class Cat
{
  String name;
  Cat(String n) { name = n; }
  public void talk() { System.out.println("Cat " + name + " meows!"); }
  public void walk() { System.out.println("Cat " + name + " walks..."); }
}

也添加一个字段来测试这一点。对于我的测试,我只是在创建其实例的方法中声明了这些类:

Dog dog = new Dog("Rex");
Cat cat = new Cat("Felix");

我首先尝试将这些 Java 对象转换为 Lua,使用LuaValue luaDog = LuaValue.userdataOf(dog);但它不起作用:我们确实有用户数据,如跟踪所示,但没有元表,因此我们无法调用方法或访问字段。

经过一番搜索,我找到了正确的咒语:

CompiledScript script = ((Compilable) scriptEngine).compile(reader);
Bindings sb = new SimpleBindings();
script.eval(sb); // Put the Lua functions into the sb environment
LuaValue luaDog = CoerceJavaToLua.coerce(dog); // Java to Lua
LuaFunction onTalk = (LuaFunction) sb.get("onTalk"); // Get Lua function
LuaValue b = onTalk.call(luaDog); // Call the function
System.out.println("onTalk answered: " + b);
LuaFunction onWalk = (LuaFunction) sb.get("onWalk");
LuaValue[] dogs = { luaDog };
Varargs dist = onWalk.invoke(LuaValue.varargsOf(dogs)); // Alternative
System.out.println("onWalk returned: " + dist);

我很欣赏 Luaj API...:-) 可能更适合 Java 程序员,而其他库似乎更针对 Lua / C 程序员...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将对象传递给公开的 luaj 函数? 的相关文章

随机推荐

  • 在 numpy 中使用屏蔽数组进行索引

    我有一些代码尝试在另一个数组指定的索引处查找数组的内容 该索引可能指定超出前一个数组范围的索引 input np arange 0 5 indices np array 0 1 2 99 我想做的是这样的 打印输入 索引 并得到 0 1 2
  • 改进的命名策略在 Hibernate 5 中不再起作用

    我有简单的 spring jpa 配置 其中配置了 HibernateImprovedNamingStrategy 这意味着如果我的实体类有一个变量userName 那么 Hibernate 应该将其转换为user name用于查询数据库
  • 在 QRubberband 上实现调整大小手柄? QSizeGrip 相关吗?

    我想让我的QRubberband实例用户可调整大小 我见过这个问题here但没有解决办法 用例是 用户可以在照片上拖出选择框 然后通过拖动来进行微调QRubberband边距以更改几何图形 或通过拖动选择来重新定位现有几何图形 我已经实现了
  • 在IOS 11中,后台的DeviceMotion停止工作

    我的应用程序在后台报告并记录位置 高度 旋转和加速度计数据 DeviceMotion 这在 ios 10 3 3 上运行良好 在 iOS 11 上 设备锁定时我无法再访问运动数据 不过 高度数据和位置数据仍在传输到控制台 IOS 11 中是
  • Excel 数据透视表 - 多列

    我正在尝试使用以下数据在 Excel 中创建数据透视表 我试图得出的最终结果 使用枢轴 是这样的摘要 但是我不知道如何让 Excel 计算 添加 考虑所有列 我可以为每个单独的字段 列创建一个数据透视表 但无法弄清楚如何将数据编译在一起 请
  • Lua 中元方法的继承

    我非常喜欢 programming in lua 16 1 16 2 中如何描述面向对象编程 http www lua org pil 16 1 html http www lua org pil 16 2 html 并愿意遵循这种方法 但
  • 如何在flutter中获取唯一的设备ID?

    在 Android 中我们有 Settings Secure ANDROID ID 我不知道 iOS 的等效项 有没有flutter插件或者一种方法可以在flutter中获取Android和IOS的唯一设备ID 空安全代码 Use 设备信息
  • UML 图表在“现实世界”中使用的频率如何? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 几乎我的每一门编程课程都使用了 UML 但没有人真正解释过它何时何地可以在专业环境中使用 是否对项目中的每个文件都执行了此操作 或者是否有一些您何时需要使用它的经验法则 另外 它更常见的是
  • 如何在 Javascript 中检测 ALT 键被按下?

    We are creating a web user interface that looks like a desktop window Now we need to handle the Alt key When Alt key is
  • 如何在 apollo 客户端中将 Mutations 链接在一起

    我的状态中存储了一堆信息 我需要使用突变将其传递到我的 graphQL 服务器 但我需要在调用下一个突变之前使用每个突变的结果 因为我需要 在我的数据库中创建一个新对象 使用为该对象生成的 id 创建另一个对象 修改原对象 存储第二个对象生
  • 使用python通过串口发送十六进制

    这个周末我要做一个小项目 我有一个太阳能电池逆变器 丹佛斯 ULX 3600i 我将尝试将其连接到我的 Linux 机器 看看我是否可以从中获取数据 创建多少能量 例如统计数据 其上有一个用于RJ45连接的输入 但带有RS485 我用电缆通
  • 密度图下的面积不等于 1

    我正在尝试使用 ggplot 绘制概率密度图 我的问题是曲线下的面积不等于一 感谢建议 示例图表 生成此图表的代码如下 Y 轴看起来像是小型垃圾箱的计数 而不是落入该垃圾箱的概率 示例代码here 是我在准备此图表时借鉴的来源之一 示例代码
  • Spring JavaConfig:为自定义 Servlet 添加映射

    在基于 javaconfig 的 Spring 4 0 项目中 如何将某个 URL 的映射添加到除 Spring DispatcherServlet 之外的 Servlet 我的情况是 我想使用 H2 数据库中的 h2console 该数据
  • 尝试了解编写 Python/C++ 混合体的链接过程

    我想开始更多地了解如何使用 SWIG 和其他方法来连接 Python 和 C 首先 我想编译这个简单的程序另一个帖子 include
  • Android,前置和后置摄像头方向,横向

    在我的相机应用程序中 您可以在前置摄像头和后置摄像头之间切换 当我用后置摄像头拍照时 图片与预览所示相同 但是当我切换到前置摄像头时 图片是镜像的 我认为这与前置和后置摄像头处于横向模式有关 我已经尝试了几乎所有给出的答案 如果有人能指出我
  • 传递给 Illuminate\Auth\Guard::login() 的参数 1 必须实现接口 Illuminate\Auth\UserInterface,给定 open 为 null:

    我使用 OAuth2 执行 Facebook 登录 然后使用 Laravel 4 的内置身份验证系统让用户在重新访问时重新登录 对于大多数用户来说 我认为我所拥有的没有任何问题 但对于一名用户来说 他在登录时看到以下错误 ErrorExce
  • 从 Grails 中的布局视图访问模型

    我在 Grails 中使用布局支持 sitemesh 效果很好 我想调整我的布局 使其取决于用户是否登录 我的 grails app views layouts main gsp 包含以下代码
  • 如何使用 awk 将带标题的新列添加到 csv

    我在处理 CSV 的 bash 脚本中使用了一些 awk awk 这样做 ORIG FILE score model csv NEW FILE updates score model csv awk v d 2017 01 F BEGIN
  • Python .split() 不带 'u

    在Python中 如果我有一个像这样的字符串 a Hello to everybody 我也这么做 a split 然后我得到 u Hello u to u everybody 这只是一个例子 我怎样才能得到一个简单的列表而不让你烦恼 Th
  • 如何将对象传递给公开的 luaj 函数?

    我正在尝试使用 Luaj java 构建一个控制器 我有以下java类 public class Duck public void talk System out println Duck quacks public void walk S