【问题标题】:Lua How to tell 1 from 1.0Lua 如何区分 1 和 1.0
【发布时间】:2015-09-08 23:33:46
【问题描述】:

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

绝对值写为 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

【问题讨论】:

  • 你是如何阅读文件的?您可以在转换为正常使用的数字之前使用字符串值吗?然后以某种方式“标记”该值?
  • @jean 不,这不是从 C/C++ 访问的用户数据,我需要在 Lua 脚本中对数字 Lua 类型执行此操作。
  • 如果用户想写一个百分比值,其中有小数点,比如 12.5?您是否考虑过只允许绝对值或只允许百分比?您说您的目标是简单,恕我直言,1 和 1.0 意味着不同的事物非常令人困惑。
  • 如果它是一个字符串,这根本不是问题,我只是想知道是否可以不使用字符串。正如@Youka 提到的,在 Lua 5.3 中是可能的。

标签: types lua integer double lua-5.2


【解决方案1】:

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

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

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

【讨论】:

  • 这确实是一个有趣的解决方案,但是我忘记添加标签 Lua 5.2。我无法控制使用的 Lua 版本:(
  • 我将此标记为解决方案,因为它是可能的,至少在 Lua 5.3 中。但是,对于我自己的问题,我不能使用这个解决方案。我必须退回到我的计划 B 来使用字符串。
  • @MaxKielland 如果您关心性能,那么进行字符串-> 数字转换并不是一个非常聪明的解决方案。如果您的 Lua 解释器是 luajit,则表甚至可以优化为比您的字符串解决方案更便宜的东西。
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 正如我已经说过的,如果它是一个字符串,那根本不会有问题;) table 的东西是一个有趣的解决方案,但它使它变得更加复杂。那么只有 '100%' 或 '1' 的字符串对用户来说会容易得多。
【解决方案3】:

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

【讨论】:

  • 这也是一个有趣的解决方案,但它使用户难以理解为什么他们必须添加这么多小数。我想我将使用我的下一个备份计划来使用带有 % 符号的字符串。
【解决方案4】:

一些建议:

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

2) 使用函数使格式明确

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

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

【讨论】:

  • 我也喜欢这个想法 :) 它简洁易懂。
  • 另一个建议:使用不同的键。例如。 config.paramA = 1config.paramA_percent = 1。使用一些元表技巧,两者都可以写入同一个字段。
猜你喜欢
  • 2010-11-12
  • 2013-08-28
  • 2014-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-03
  • 2012-07-19
  • 2017-09-02
相关资源
最近更新 更多