在luajava中强制使用整数类型。
有没有办法在LuaJava中强制使用整数类型?我正在尝试在LuaJ 3.0 beta 1(luaj-jse-3.0-beta1.jar)中创建java.awt.Color的实例。鉴于Java API提供了构造函数([JavaAPI](http://docs.oracle.com/javase/7/docs/api/java/awt/Color.html),您不会认为这会成为一个问题。我有兴趣强制将整数传递给构造函数的原因是可用的`Color`构造函数需要三个和四个`int`或`float`参数。由于Lua的数字类型为`double`,因此LuaJ(或LuaJava)调用构造函数的`float`版本。
起初,我认为这并不是一个问题,但在尝试使用它后,我注意到我收到了错误的Color。值未正确传递到构造函数中,而Color对象实际上已损坏,没有明显的错误(它没有崩溃任何内容,只是没有显示)。
这里是一个快速的例子:
local j_color = luajava.newInstance( "java.awt.Color", r, g, b );
print( j_color );
如果我将 r = 1.0,g = 0.2,b = 0.2 传递给此构造函数,然后打印 j_color,我会看到
java.awt.Color[r=0,g=0,b=1]
在输出中。实际上,只要 b = 0,我可以使用任何我想要的 r和g,没有任何问题,但是如果这不是这样,它将引起痛苦。
我有点好奇是否有其他人遇到了这个问题。如果它没有解决,我将与LuaJ项目的PI联系,并报告回来。
顺便说一句:通过构建使用自定义Java函数负责创建Color的解决方案将是一件简单的事情。我更担心存在这个问题,以及是否有某种方法来指定要使用的构造函数,或者显式告诉LuaJava使用整数而不是双精度数。
更新
我还尝试使用四个浮点数构造函数,同样的问题出现了。如果我传递以下值之一:alpha = 0,0.5,1,则构造函数将正常工作。其他任何内容都会产生上面的结果。
你可以强制Luaj使用三个浮点数的构造函数,如下所示:
function color(r,g,b)
r = luajava.newInstance("java.lang.Float",r)
g = luajava.newInstance("java.lang.Float",g)
b = luajava.newInstance("java.lang.Float",b)
return luajava.newInstance("java.awt.Color",r,g,b)
end
当然,你也可以类似地强制Luaj使用其他重载的构造函数形式。
- 如何将两个不同的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中获取用户配置主目录的跨平台方法
Lua 中的数值类型问题
函数 math.floor() 和 math.ceil() 用于数值的向下取整和向上取整,并始终生成整数值。
对于
java.awt.Color,最好使用单个整数构造函数,因为没有相应的浮点型构造函数。这样同样的构造函数将在每一次选择时都被使用。以下是一个可行的样例:
-- 返回由浮点值 r、g、b 组成的 Java Color,范围在 [0,1] 之间 function color(r, g, b) local ir = math.floor(r * 255) local ig = math.floor(g * 255) local ib = math.floor(b * 255) local packed_rgb = ir*(256*256) + ig*256 + ib return luajava.newInstance("java.awt.Color", packed_rgb) end然后,你提供的错误案例将会有预期的结果:
-- 测试样例 print( color(1, .2, .2) ) > java.awt.Color[r=255,g=51,b=51]问题在于基于数值类型的重载函数在运行时的选择问题。对于 java Color 类,存在如此多的重载函数,以至于当浮点型和双精度值稍有差别(例如 .2)时,这会在 luaj 中触发选择逻辑的错误。
长期来看,如果 luaj 能够公开使用特定函数完整调用签名的机制,那么这将是更可靠的一种调用所需重载函数的方法。但在 luaj-3.0-beta3 中,以上是目前最可靠的方法。