我有一个可以用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失败,它将跳到下一个有效的返回。好不好?有人看到任何问题吗?
答案 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)
。