Lua 函数如何返回 nil,即使函数内部的返回值不是 nil?
Posted
技术标签:
【中文标题】Lua 函数如何返回 nil,即使函数内部的返回值不是 nil?【英文标题】:How can a Lua function return nil, even if the returned value is not nil inside the function? 【发布时间】:2020-01-05 21:59:33 【问题描述】:我创建了一个(伪)随机创建包含数字的表格的函数。然后我循环这个函数,直到至少找到正确的结果。一旦我确认至少存在一个这样的结果,我就会停止函数并返回表格。
当我创建包含小值的表时,没有问题。然而,一旦随机数增长到数百个范围,该函数开始返回 nil,即使在我返回它之前的那一行表是真的。
local sort = table.sort
local random = math.random
local aMin, aMax = 8, 12
local bMin, bMax = 200, 2000
local function compare( a, b )
return a < b
end
local function getNumbers()
local valid = false
local numbers =
-- Generate a random length table, containing random number values.
for i = 1, random( aMin, aMax ) do
numbers[i] = random( bMin, bMax )
end
sort( numbers, compare )
-- See if a specific sequence of numbers exist in the table.
for i = 2, #numbers do
if numbers[i-1]+1 == numbers[i] or numbers[i-1] == numbers[i] then
-- Sequence found, so stop.
valid = true
break
end
end
for i = 1, #numbers-1 do
for j = i+1, #numbers do
if numbers[j] % numbers[i] == 0 and numbers[i] ~= 1 then
valid = true
break
end
end
end
if valid then
print( "Within function:", numbers )
return numbers
else
getNumbers()
end
end
local numbers = getNumbers()
print( "Outside function:", numbers )
据我了解,这个函数应该无限循环,直到我找到一个有效的序列。根据我的代码,该函数甚至可以结束的唯一方法是 valid 为真。
有时,通常情况下,如果数字很大,函数会简单地将 nil 值输出到函数外部。这是怎么回事?
【问题讨论】:
【参考方案1】:你只是在做getNumbers()
递归而不是return getNumbers()
。这意味着如果输入了递归,无论发生什么,最终返回的值都是nil
。
【讨论】:
但事实并非如此,对吧?如果valid
为真,那么我返回数字。如果valid
不是真的,那么我重复这个函数。最终valid
为真,它将打印“函数内:”并给出表引用,但函数外的打印将打印零。还是我在这里遗漏了什么?
@JamesT。如果在递归调用中不使用return
,您将丢弃递归的值。
明白。不敢相信我在这里空白了将近一个小时,并且在此处发布功能后 1 分钟内就修复了。【参考方案2】:
在if valid then
的else
情况下,您不会返回任何内容。在valid
案例中,您只需要return
任何东西。在else
的情况下,递归调用可能返回一些东西,但是你忽略了返回的值。您看到的打印对应于递归调用的返回;它不是原来的电话。
你的意思是return getNumbers()
。
【讨论】:
以上是关于Lua 函数如何返回 nil,即使函数内部的返回值不是 nil?的主要内容,如果未能解决你的问题,请参考以下文章