首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Scala中使用LuaJ

在Scala中使用LuaJ
EN

Stack Overflow用户
提问于 2013-11-20 06:01:46
回答 2查看 1.3K关注 0票数 1

我正在尝试在Scala中使用LuaJ。大多数东西都能用(实际上,如果你做得正确,所有的东西都能用!)但是,由于Scala的setter实现,设置对象值的简单任务变得异常复杂。

Scala:

代码语言:javascript
复制
class TestObject {
  var x: Int = 0
}

Lua:

代码语言:javascript
复制
function myTestFunction(testObject) 
  testObject.x = 3
end

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

正如我所说的,有一些解决方法可以解决这个问题,比如定义自己的setter或使用@BeanProperty标记。他们只是编写了一些代码,这些代码应该很容易编写,但却要复杂得多:

Lua:

代码语言:javascript
复制
function myTestFunction(testObject) 
  testObject.setX(testObject, 3)
end

有没有人知道如何让luaj隐式地调用setter来进行这样的赋值?或者我可以在luaj源代码中查找,也许可以实现这样的东西?

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2013-11-20 07:09:17

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

代码语言:javascript
复制
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的源代码以更好地满足您的需求,我快速浏览了文档和源代码,找到了thisthisthis。我最好的猜测是,如果line 71 of JavaInstance.java需要一种不同的设置值方式,那么您将在Scala中找到需要更改的内容。

代码语言:javascript
复制
    f.set(m_instance, CoerceLuaToJava.coerce(value, f.getType()));
票数 1
EN

Stack Overflow用户

发布于 2014-01-14 23:26:59

也许你应该使用方法语法:

代码语言:javascript
复制
testObject:setX(3)

注意冒号“:”而不是点“.”这在某些编辑器中可能很难区分。

这与函数调用具有相同的效果:

代码语言:javascript
复制
testObject.setX(testObject, 3)

但可读性更好。

它还可以用于调用类上的静态方法:

代码语言:javascript
复制
luajava.bindClass("java.net.InetAddress"):getLocalHost():getHostName()

':‘左边的部分只计算一次,所以像这样的语句

代码语言:javascript
复制
x = abc[d+e+f]:foo()

将被评估,就好像它是

代码语言:javascript
复制
local tmp = abc[d+e+f]
x = tmp.foo(tmp)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20083005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档