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 thenelse 情况下,您不会返回任何内容。在valid 案例中,您只需要return 任何东西。在else 的情况下,递归调用可能返回一些东西,但是你忽略了返回的值。您看到的打印对应于递归调用的返回;它不是原来的电话。

你的意思是return getNumbers()

【讨论】:

以上是关于Lua 函数如何返回 nil,即使函数内部的返回值不是 nil?的主要内容,如果未能解决你的问题,请参考以下文章

Lua函数返回字符串,但调用函数得到nil

Lua - C++ 集成:从 C++ 调用表中的函数

LUA怎么获取指定的函数返回值

如何让lua调用一个向lua返回多个值的c++函数

lua基础简介

当for内部有查询时如何返回异步函数的值