lua - 测试两个输入是否为数字且不为空

标签 lua

我有一个可以用 0、1 或 2 个参数调用的函数。我想测试一下输入了多少个参数以及它们是否是实际数字。这是代码:

first = tonumber(frame.args[1])
second = tonumber(frame.args[2])

if first then
  if first <= second then
    return math.random(first, second)
  end
return math.random(first)
end   
return math.random()

我的想法是,如果它们不是数字(或为空),那么当我调用 tonumber() 时,变量将为假。如果它们都是 NaN,则 <= 可能为真,但它们必须经过作为数字存在的“第一个”,因此它们都必须是数字,并且比较不会使 if 语句短路。如果任何 if 失败,它就会跳到下一个有效的返回。看起来不错?有人看到任何问题吗?

最佳答案

如果 first 是一个数字并且 second 是 nil,你的代码就会中断,因为将数字与 nil 进行比较是错误的。这是一个更正确的版本:

first = tonumber(frame.args[1])
second = tonumber(frame.args[2])

if second and first and (first <= second) then
  return math.random(first, second)
elseif first then
  return math.random(first)
else return math.random() end

但是这段代码非常脆弱:它不检查参数的类型,也不确保数字是整数。根据它的用途,您可能希望使其更严格。一个真正严格的版本应该是这样的:

local is_int = function(n)
  return (type(n) == "number") and (math.floor(n) == n)
end

local first, second = frame.args[1], frame.args[2]

if first == nil then
  assert(second == nil)
  return math.random()
else
  assert(is_int(first))
  if second == nil then
    return math.random(first)
  else
    assert(is_int(second))
    return math.random(first,second)
  end
end

当然,您也可以决定在意外输入时返回 nil 而不是使用断言...

关于lua - 测试两个输入是否为数字且不为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14995125/

相关文章:

javascript - 简单的 Node.js 故障排除 - 从 app.get() 接收 404

c - 如何从 C 函数返回一个多维表到 lua?

unicode - 是否可以使用 Unicode 输入注音假名(和 Ruby 字符)?

lua - Lua 中记录类型的约定是什么?

java - 用 Java 包装 Lua API

lua - '<' 附近的意外符号

c - 当在 userdata 上调用 __len 元方法时,Lua 将两个参数传递给 C,nil 和 userdata。什么是零?

c - 如何限制Lua字符串中的字符数

lua - 在Lua中,如何在不复制的情况下获取数组的尾部?

lua - 如何计算两个矩形之间的距离? (上下文 : a game in Lua. )