4

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

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

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

这可能吗?

回顾:

a = 1
b = 1.0

如何判断它ab.

编辑 配置文件看起来像这样:

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
4

4 回答 4

7

Lua 5.3出现了整数数据类型,它允许在整数和浮点数之间进行区分,并在某些情况下提供更好的性能。math.type是获取数字子类型的函数。

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

如果您的百分比值也应该是浮点数,William已经将其称为:“数字就是数字”。您必须向您的号码添加附加信息以进行区分,例如将其包装在带有标识符的表格中。因为您只有 2 个案例,所以布尔值将是一个便宜的解决方案。

于 2015-09-08T15:09:19.247 回答
4

PIL中您可以看到数字是数字,因此在使用它们时无法区分11.0因为它们确实具有相同的类型

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

config.paramA = { 1, 'i' }
config.paramB = { 1.0, 'd' }

或者使用字符串并在转换为整数之前对其进行解析:

config.paramA = '1'
config.paramB = '1.0'
于 2015-09-08T14:38:18.223 回答
2

Lua 5.1 和 5.2 没有区别,从luac输出 ( luac -i)可以看出,local 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

Lua 5.3 允许使用math.type区分两者,因为它们具有不同的子类型。

作为您特定问题的解决方案,如果您真的想让它成为非整数,您可以在数字上添加一个非常小的增量:1.0000001而不是1.0.

于 2015-09-08T15:27:12.013 回答
1

一些建议:

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

2) 使用函数使格式明确

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

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

于 2015-09-08T15:33:46.443 回答