使用LuaJ和Scala
2013-11-19 22:1:46
收藏:0
阅读:139
评论:2
我正在尝试将LuaJ与Scala一起使用。大多数东西都能正常运作(实际上,如果正确操作,则所有东西都能正常运作!),但由于Scala的setter实现,设置对象值的简单任务变得异常复杂。
Scala:
class TestObject {
var x: Int = 0
}
Lua:
function myTestFunction(testObject)
testObject.x = 3
end
如果我执行包含此Lua函数的脚本或行,并将coerced TestObject的实例传递给myTestFunction,这将导致LuaJ出错。 LuaJ试图直接写入该值,并且Scala要求您通过隐式定义的setter(其名称为x_ =,这不是有效的Lua,因此即使尝试将其作为函数调用也会使您的Lua不解析)。
正如我所说,有解决方法,例如定义自己的setter或使用@BeanProperty标记。它们只会让本应易于编写的代码变得更加复杂:
Lua:
function myTestFunction(testObject)
testObject.setX(testObject, 3)
end
有人知道如何使luaj在这样的赋值中隐式调用setter的方法吗?或者在luaj源代码中可以查找哪里以实现这样的事情?
谢谢!
点赞
用户2556943
也许你应该使用以下这种语法:
testObject:setX(3)
请注意冒号 ':' 替代了点 '.',在某些编辑器中这两者很难区分。
这与函数调用的作用相同:
testObject.setX(testObject, 3)
但更容易理解。
它还可用于调用类上的静态方法:
luajava.bindClass("java.net.InetAddress"):getLocalHost():getHostName()
在 ':' 左边的部分仅会被评估一次,因此下面的语句
x = abc[d+e+f]:foo()
会评估如同下面这条语句:
local tmp = abc[d+e+f]
x = tmp.foo(tmp)
2014-01-14 15:26:59
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
我必须承认,我对LuaJ不是太熟悉,但是关于你的问题,我首先想到的是将对象封装在代理表中,以便与API交互。根据你的需要,这个解决方案可能是最好的,也可能只是一个好的临时修复方法。
local mt = {} function mt:__index(k) return self.o[k] -- 在这里定义如何获取器工作。 end function mt:__newindex(k, v) return self.o[k .. '_='](v) -- “object.k_=(v)” end local function proxy(o) return setmetatable({o = o}, mt) end -- ... function myTestFunction(testObject) testObject = proxy(testObject) testObject.x = 3 end我相信这可能是解决你的问题最不侵入性的方法。至于修改LuaJ的源代码以更好地适应你的需要,我已经快速查看了文档和源代码,并找到了 这个、这个和 这个。我的最佳猜测是,如果Scala需要设置值的不同方式,你会在 JavaInstance.java 的第71行 找到需要更改的内容。
f.set(m_instance, CoerceLuaToJava.coerce(value, f.getType()));