Lua 如何区分 1 和 1.0
Lua How to tell 1 from 1.0
我有一个配置脚本,用户可以在其中输入绝对值或百分比值的值。
绝对值表示为 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
从 PIL 可以看出数字就是数字,因此在使用它们时无法区分 1
和 1.0
,因为它们确实具有相同的类型
解决问题的一种方法是使用包含值和类型的 table:
config.paramA = { 1, 'i' }
config.paramB = { 1.0, 'd' }
或者使用字符串并在转换为整数之前对其进行解析:
config.paramA = '1'
config.paramB = '1.0'
随着 Lua 5.3 出现了 整数 数据类型,它允许区分整数和浮点数并提供更好的在某些情况下的表现。 math.type是获取数字子类型的函数。
local x = 1.0
print(math.type(x)) -- float
x = 1
print(math.type(x)) -- integer
如果您的百分比值也应该是浮点数,William 已经调用它:"a number is a number"。您必须在您的号码中添加附加信息以进行区分,例如将其包装在带有标识符的 table 中。因为您只有 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
。
一些建议:
1) 只允许两种格式中的一种
2) 使用函数使格式显式化
config.paramA = percent(1.9)
config.paramB = portion(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
从 PIL 可以看出数字就是数字,因此在使用它们时无法区分 1
和 1.0
,因为它们确实具有相同的类型
解决问题的一种方法是使用包含值和类型的 table:
config.paramA = { 1, 'i' }
config.paramB = { 1.0, 'd' }
或者使用字符串并在转换为整数之前对其进行解析:
config.paramA = '1'
config.paramB = '1.0'
随着 Lua 5.3 出现了 整数 数据类型,它允许区分整数和浮点数并提供更好的在某些情况下的表现。 math.type是获取数字子类型的函数。
local x = 1.0
print(math.type(x)) -- float
x = 1
print(math.type(x)) -- integer
如果您的百分比值也应该是浮点数,William 已经调用它:"a number is a number"。您必须在您的号码中添加附加信息以进行区分,例如将其包装在带有标识符的 table 中。因为您只有 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
。
一些建议:
1) 只允许两种格式中的一种
2) 使用函数使格式显式化
config.paramA = percent(1.9)
config.paramB = portion(1)
这些函数可以创建具有类型信息的表,或者只是将值转换为一致的类型