测试两个输入是否为数字而不是空

时间:2013-02-21 05:21:29

标签: 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,则&lt; =可能是真的,但是它们必须通过“first”作为数字存在,因此它们都必须是数字并且比较不会使if语句短路。如果任何if失败,它将跳到下一个有效的返回。好不好?有人看到任何问题吗?

2 个答案:

答案 0 :(得分:3)

如果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而不是使用断言......

答案 1 :(得分:1)

如果可以接受包含数字的字符串,tonumber(foo)将起作用,并且实际上会在内部将其转换为“数字”值。但是如果您需要知道Lua是否认为它是实际数字而不是字符串,请在测试条件中使用'number' == type(foo)