【问题标题】:How to call a function within a function in Lua?如何在 Lua 中的函数内调用函数?
【发布时间】:2018-09-11 01:24:55
【问题描述】:

我有这个代码:

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: 尝试索引一个 nil 值

我想做的是在函数test()中调用函数notawesome(),我该怎么做?

【问题讨论】:

    标签: function lua nested-function


    【解决方案1】:

    你的函数没有返回任何东西(因此返回 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()
    

    【讨论】:

    • 为什么这样的代码不需要返回 function test() print("blah") end test()
    • 你的函数也不需要需要返回,它也返回nil。但是,如果你想访问在你的函数中定义的一些东西,你需要返回它。
    • @lhf 在对我的回答的评论中提到了变量范围。可以通过将变量 awesomenotawesomenotevenawesome 设置为局部变量来改进此答案,因为它们不在 test 函数之外使用。 test 也可以本地化,但这取决于设计。
    【解决方案2】:

    @Axnyff explains 你可能想要做什么。我会解释你做了什么。

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

    当您运行代码时,会评估函数定义并将生成的函数值分配给变量test。然后变量test 被评估并且它的值被作为一个函数调用(它是一个)。

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

    因此,当调用test (nil) 的结果由字符串“awesome”索引时,您会收到错误消息。

    如果您想调用变量awesome所引用的函数值,只需执行awesome()即可。

    【讨论】:

    • 另外,awesomenotawesomenotevenawesome全局变量。
    • @lhf 是的,我考虑说所有变量都是全局的。然而,即使变量是本地的,代码也会做同样的事情(在这种情况下,and 给定使用的语法,会令人困惑,被认为是不好的风格)。
    【解决方案3】:

    如果你想实现它而不是使用 main 函数,你可以使用一个对象:

    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.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-14
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 2015-03-08
      • 1970-01-01
      • 2016-12-15
      • 2013-12-22
      相关资源
      最近更新 更多