将LuaJ与Scala一起使用

将LuaJ与Scala一起使用,scala,lua,luaj,Scala,Lua,Luaj,我正在尝试将LuaJ与Scala一起使用。大多数事情都是可行的(如果你做得正确的话,实际上所有事情都是可行的!),但是由于Scala的setter实现,设置对象值的简单任务变得异常复杂 斯卡拉: class TestObject { var x: Int = 0 } 卢阿: 如果执行包含此Lua函数的脚本或行,并将强制的TestObject实例传递给myTestFunction,则会在LuaJ中导致错误。LuaJ正在尝试直接写入值,Scala要求您通过隐式定义的setter(使用可怕的名称

我正在尝试将LuaJ与Scala一起使用。大多数事情都是可行的(如果你做得正确的话,实际上所有事情都是可行的!),但是由于Scala的setter实现,设置对象值的简单任务变得异常复杂

斯卡拉:

class TestObject {
  var x: Int = 0
}
卢阿:

如果执行包含此Lua函数的脚本或行,并将强制的TestObject实例传递给myTestFunction,则会在LuaJ中导致错误。LuaJ正在尝试直接写入值,Scala要求您通过隐式定义的setter(使用可怕的名称x_=,这不是有效的Lua,因此即使尝试将其作为函数调用,也会使您的Lua无法解析)

正如我所说,有一些解决方法,比如定义自己的setter或使用@BeanProperty标记。它们只是让代码变得更容易编写,更复杂:

卢阿:

有人知道让luaj隐式调用setter来完成此类任务的方法吗?或者我可以在哪里查找luaj源代码来实现这样的事情


谢谢

我必须承认,我对LuaJ不太熟悉,但我想到的关于您的问题的第一件事是将对象包装在代理表中,以简化与API的交互。根据您的需求类型,此解决方案可能是最好的,也可能不是最好的,但它可能是一个很好的临时解决方案

localmt={}
函数mt:uu索引(k)
return self.o[k]——在这里定义getter的工作方式。
结束
函数mt:uu newindex(k,v)
返回self.o[k..'.='](v)-“object.k.=(v)”
结束
局部函数代理(o)
返回setmetatable({o=o},mt)
结束
-- ...
函数myTestFunction(testObject)
testObject=代理(testObject)
testObject.x=3
结束

我相信这可能是解决你问题的最简单的方法。至于修改LuaJ的源代码以更好地满足您的需要,我快速浏览了文档和源代码,找到了,和。我的最佳猜测是,如果Scala需要一种不同的设置值的方法,您可以在这里找到需要更改的内容

f.set(m_实例,improveluatojava.improve(value,f.getType());

我必须承认我对LuaJ不太熟悉,但我想到的第一件事是将对象包装在代理表中,以便于与API的交互。根据您的需求类型,此解决方案可能是最好的,也可能不是最好的,但它可能是一个很好的临时解决方案

localmt={}
函数mt:uu索引(k)
return self.o[k]——在这里定义getter的工作方式。
结束
函数mt:uu newindex(k,v)
返回self.o[k..'.='](v)-“object.k.=(v)”
结束
局部函数代理(o)
返回setmetatable({o=o},mt)
结束
-- ...
函数myTestFunction(testObject)
testObject=代理(testObject)
testObject.x=3
结束

我相信这可能是解决你问题的最简单的方法。至于修改LuaJ的源代码以更好地满足您的需要,我快速浏览了文档和源代码,找到了,和。我的最佳猜测是,如果Scala需要一种不同的设置值的方法,您可以在这里找到需要更改的内容

f.set(m_实例,improveluatojava.improve(value,f.getType());

也许您应该使用以下方法语法:

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)

也许您应该使用以下方法语法:

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)
您可以将testObject.setX(testObject,3)作为testObject:setX(3)编写,这样可以接受吗?您可以将testObject.setX(testObject,3)作为testObject:setX(3)编写,这样可以接受吗?