我正在尝试在Scala中使用LuaJ。大多数东西都能用(实际上,如果你做得正确,所有的东西都能用!)但是,由于Scala的setter实现,设置对象值的简单任务变得异常复杂。
Scala:
class TestObject {
var x: Int = 0
}Lua:
function myTestFunction(testObject)
testObject.x = 3
end如果我执行包含这个Lua函数的脚本或行,并将一个强制的TestObject实例传递给myTestFunction,这会在LuaJ中导致一个错误。LuaJ正在尝试直接写入值,而Scala要求您通过隐式定义的setter (使用可怕的名称x_=,它不是有效的Lua,所以即使尝试将其作为函数调用也会导致Lua不能解析)。
正如我所说的,有一些解决方法可以解决这个问题,比如定义自己的setter或使用@BeanProperty标记。他们只是编写了一些代码,这些代码应该很容易编写,但却要复杂得多:
Lua:
function myTestFunction(testObject)
testObject.setX(testObject, 3)
end有没有人知道如何让luaj隐式地调用setter来进行这样的赋值?或者我可以在luaj源代码中查找,也许可以实现这样的东西?
谢谢!
发布于 2013-11-20 07:09:17
我必须承认我不太熟悉LuaJ,但是对于您的问题,我想到的第一件事就是将对象包装在代理表中,以简化与该应用程序接口的交互。根据您的需求,这个解决方案可能是最好的,也可能不是最好的,但它可能是一个很好的临时解决方案。
local mt = {}
function mt:__index(k)
return self.o[k] -- Define how your getters work here.
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的源代码以更好地满足您的需求,我快速浏览了文档和源代码,找到了this、this和this。我最好的猜测是,如果line 71 of JavaInstance.java需要一种不同的设置值方式,那么您将在Scala中找到需要更改的内容。
f.set(m_instance, CoerceLuaToJava.coerce(value, f.getType()));发布于 2014-01-14 23:26:59
也许你应该使用方法语法:
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)https://stackoverflow.com/questions/20083005
复制相似问题