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

我有一个函数,它可以用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()时,变量将为false。如果它们都是NaN,则<=可能为真,但它们必须通过"first"存在作为数字,因此它们都必须是数字,比较不会使if语句短路。如果任何if失败,它将跳转到下一个有效return。看起来不错?有人看到任何问题吗?

点赞
用户2069675
用户2069675

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

2013-02-21 07:46:05
用户204011
用户204011

如果 first 是一个数字,而 secondnil,那么你的代码会出现错误,因为将一个数字与 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,而不是使用断言...

2013-02-21 11:17:54