Types Lua如何区分1和1.0

Types Lua如何区分1和1.0,types,lua,integer,double,lua-5.2,Types,Lua,Integer,Double,Lua 5.2,我有一个配置脚本,用户可以在其中输入值作为绝对值或百分比值 绝对值写为0.0到1.0之间的值,而百分比值写为0到100 如何区分1和1.0? 如果我使用字符串,那么这肯定不是问题。。。 我希望这个配置保持简单,不必依赖字符串 这可能吗 概述: a = 1 b = 1.0 如何判断a与b的类型不同 编辑 配置文件如下所示: local config = {} -- A lot of comments describing how to configure config.paramA = 1

我有一个配置脚本,用户可以在其中输入值作为绝对值或百分比值

绝对值写为0.0到1.0之间的值,而百分比值写为0到100

如何区分1和1.0? 如果我使用字符串,那么这肯定不是问题。。。 我希望这个配置保持简单,不必依赖字符串

这可能吗

概述:

a = 1
b = 1.0
如何判断
a
b
的类型不同

编辑 配置文件如下所示:

local config = {}

-- A lot of comments describing how to configure

config.paramA = 1
config.paramB = 1.0

return config
config = require 'MyConfigFile'

config.paramA
config.paramB
在我的处理脚本中,我阅读了如下配置:

local config = {}

-- A lot of comments describing how to configure

config.paramA = 1
config.paramB = 1.0

return config
config = require 'MyConfigFile'

config.paramA
config.paramB
从中可以看出,数字就是一个数字,因此在使用它们时无法区分
1
1.0
,因为它们的类型相同

解决问题的一种方法是使用同时包含值和类型的表:

config.paramA = { 1, 'i' }
config.paramB = { 1.0, 'd' }
或者在转换为整数之前使用字符串并对其进行分析:

config.paramA = '1'
config.paramB = '1.0'

lua5.3中的整数数据类型允许在整数和浮点数之间进行区分,并且在某些情况下提供更好的性能。是获取数字的子类型的函数

local x = 1.0
print(math.type(x)) -- float
x = 1
print(math.type(x)) -- integer

如果百分比值也应该是浮点值,William已经将其称为:“数字就是数字”。您必须向数字中添加额外的信息以进行区分,例如将其打包到带有标识符的表中。因为您只有两种情况,所以布尔值是一种便宜的解决方案。

对于LUA5.1和5.2,没有区别,这可以从
luac
输出(
luac-i
)中看出,因为
本地a,b=1,1.0
生成以下代码:

main <1.lua:0,0> (3 instructions, 12 bytes at 007D04E8)
0+ params, 2 slots, 0 upvalues, 2 locals, 1 constant, 0 functions
    1   [1] LOADK       0 -1    ; 1
    2   [1] LOADK       1 -1    ; 1
    3   [1] RETURN      0 1
main(3条指令,007D04E8处12字节)
0+参数,2个插槽,0个上限值,2个局部变量,1个常量,0个函数
1[1]荷载K 0-1;1.
2[1]荷载K 1-1;1.
3[1]返回0 1
Lua 5.3允许区分这两种类型,因为它们具有不同的子类型

作为特定问题的解决方案,如果您真的想将其设置为非整数,您可能可以在数字中添加一个非常小的增量:
1.0000001
,而不是
1.0

一些建议:

1) 仅允许两种格式中的一种

2) 使用函数使格式显式

config.paramA = percent(1.9)
config.paramB = portion(1)

这些函数可以创建包含类型信息的表,或者只是将值转换为一致的类型

如何读取文件?在转换为数字以供正常使用之前,是否可以使用字符串值?然后以某种方式“标记”该值?可能重复:@jean no这不是从C/C++访问的userdata我需要在Lua脚本中对数字Lua类型执行此操作。如果用户希望写入一个带有小数点的百分比值,如12.5,该怎么办?你考虑过只允许绝对值还是只允许百分比吗?你说你的目标是简单,1和1.0意味着不同的东西是非常令人困惑的。如果是字符串,这根本不是问题,我只是想知道没有字符串是否可能。正如@Youka所提到的,这在Lua5.3中是可能的。这确实是一个有趣的解决方案,但我忘记添加标签Lua5.2。我无法控制使用的Lua版本:(我将此标记为解决方案,因为它是可能的,至少在Lua 5.3中是可能的。但是,对于我自己的问题,我不能使用此解决方案。我不得不放弃我的计划B,改用字符串。@MaxKielland如果你关心性能,执行字符串->数字转换不是一个非常聪明的解决方案。如果你的Lua解释器是一个表,那么它甚至可能是一个表。)优化为比字符串解决方案更便宜的解决方案。正如我已经说过的,如果它是字符串,就不会有任何问题;)表是一个有趣的解决方案,但它使它变得更复杂。那么,对于用户来说,只有“100%”或“1”的字符串就容易多了。这也是一个有趣的解决方案,但它使用户理解为什么他们必须添加这么多小数变得更复杂。我想我将使用我的下一个备份计划,使用带有%符号inst的字符串ead。我也喜欢这个想法:)它简洁易懂。另一个建议:使用不同的键。例如,
config.paramA=1
config.paramA_%=1
。使用一些元表技巧,两者都可以写入同一字段。