如何在Lua中在一个函数内部调用另一个函数?

5

我有这段代码:

function test()
    function awesome()
        print("im awesome!")
    end

    function notawesome()
        print("im not awesome.")
    end

    function notevenawesome()
        print("im not even awesome...")
    end
end

test().notawesome()

当我运行它时,控制台会打印:
15: 试图索引一个空值
我的目的是在函数test()内调用函数notawesome(),我应该怎么做?
3个回答

7
您的函数没有返回任何内容(因此返回nil)。像这样的代码应该可以解决问题:
function test()
    function awesome()
        print("im awesome!")
    end

    function notawesome()
        print("im not awesome.")
    end

    function notevenawesome()
        print("im not even awesome...")
    end
    result = {}
    result["notawesome"] = notawesome
    result["awesome"] = awesome
    result["notevenawesome"] = notevenawesome
    return result
end
test().notawesome()

为什么像这样的代码不需要 returnfunction test() print("blah") end test() - crazicrafter1
你的函数也不需要返回值,它会自动返回 nil。但是,如果你想要访问函数内部定义的一些内容,你就需要返回它。 - Axnyff
@lhf在我的回答评论中提到了变量作用域。如果将变量awesomenotawesomenotevenawesome设置为局部变量,因为它们在test函数外部没有使用,那么这个答案就可以得到改进。test也可以被设置为局部变量,但这取决于设计。 - Tom Blodget

5

@Axnyff 解释了你可能想要做什么。我会解释你所做的事情。

如果你熟悉其他语言,请注意 Lua 没有函数声明;它有函数定义,这些定义是在求值时产生函数值的表达式。函数定义语句只是一种隐式包含赋值的快捷方式。请参阅手册。

当你运行代码时,函数定义被求值,并将产生的函数值分配给变量 test。然后,变量 test 被求值,并作为一个函数调用(它确实是一个函数)。

当该函数执行时,三个函数定义被求值并分别分配给变量 awesomenotawesomenotevenawesome。它不返回任何东西。

因此,当通过字符串“awesome”索引调用 test 的结果(nil)时,会出现错误。

如果你想调用由变量 awesome 引用的函数值,只需使用 awesome()


此外,awesomenotawesomenotevenawesome全局变量。 - lhf
@lhf 是的,我考虑过说所有变量都是全局的。然而,即使变量是局部的,代码也会执行相同的操作(在这种情况下,并且给定使用的语法,这将足够混乱,以被认为是不好的风格)。 - Tom Blodget

0
如果你想要实现这个功能而不是使用主函数,你可以使用一个对象:
test = {
    awesome = (function()
        return 'im awesome!'
    end),
    notawesome = (function()
        return 'im not awesome.'
    end),
    notevenawesome = (function()
        return 'im not even awesome...'
    end)
}

要调用你的函数,使用以下代码:

print(test.notawesome())    --> im not awesome.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接