【问题标题】:Lua: How to Properly Construct Nested FunctionsLua:如何正确构造嵌套函数
【发布时间】:2014-07-03 03:24:26
【问题描述】:

我正在尝试创建一个包含本地函数的函数。主函数将接收来自外部源的输出,并且其中的函数将需要转换该输入并返回结果以供以后使用。我的问题是我目前尝试这样做的方式,当我尝试在主函数中放入我的第一个本地函数时,我继续得到nil。这是一个例子:

function stats(input)
    height, weight, name, age, gender, relate = string.match(input, "(%d*)ft,(%d*)lbs,(%w*),(%d*),(%u*),(%u)")
    if name then
        function nameInit(relate)
            relateTable = {["F"] = "Friend", ["R"] = "Relative"}
            for k,v in pairs (relateTable) do
                if relate == k then
                    relship = v
                    return relship
                end
            end
        end
    end
    person = name.." is "..age.." years old, weighs "..weight.." and blah blah blah....
    return person
end
print (stats("5.8ft, 160lbs, Mike Scott, 19, M, F"))

显然,这个主题是不切实际的,但我正在尝试做的是在最终响应方面遵循相同的路线。我目前收到lua: filename: attempt to concatenate global 'relship' (a nil value)?我可以在没有嵌套函数的情况下得到我想要的响应。但是当我尝试详细说明我想收到的响应并将该函数放在全局函数中时,我开始得到这些响应。每当我尝试在其他函数中使用函数时,这似乎都是我的问题。我可以创建两个单独的全局函数并打印其中一个函数的结果。但是当我尝试在另一个中使用一个的那一刻,我把自己搞砸了。任何可以花一些时间帮助初学者更好地理解他做错了什么的人都会很棒!谢谢大家。

【问题讨论】:

  • 你在哪里打电话nameInit?你只是在这里定义它,但没有任何东西在调用它。
  • 另外,为什么不将stats(input) 改为stats(ht, wt, name, age, gender, relate) 而不是使用string.match 来匹配它们呢?
  • 与@ColonelThirtyTwo 一起说您也没有在该代码sn-p 的任何地方连接relship,因此它不会产生该错误。如果您想获得帮助,您需要向我们提供更准确、更完整的代码清单。 (作为一般提示,您还希望使用局部变量,包括函数,而不是到处使用全局变量。)
  • @ColonelThirtyTwo 谢谢你的帮助!
  • @EtanReisner 很抱歉没有加入当地人。在我的代码中,我确实使用它。当我输入我的示例代码时,我完全忽略了这样做。我很抱歉。但我非常感谢您的帮助!

标签: function lua nested-function


【解决方案1】:

根据您的陈述“其中的函数需要翻译该输入并返回结果以供以后使用”,我不确定嵌套函数是否是您想要的。你说当你有两个全局函数时你的代码可以工作:

function func1(args)
    ...
end

function func2(args)
    ...
end

但是当您将(例如)func1 嵌套在 func2 中时,它不再起作用。 Lua 确实允许你定义嵌套函数,但我只能想到两个使用它们的原因:

  1. 返回一个封装任务的函数,通常使用一些包装函数的参数和/或局部变量作为上值。
  2. 将一些逻辑封装在要从包装函数中调用的函数中,而无需任何其他函数来调用它。

以案例一为例:

function func2(a, b, c)
   function func1()
       do something with a, b, c eventhough they are not args of func1
       return result
   end
   return func1
end

someFunc = func2(1,2,3)
....
result = someFunc() -- calls func1 created inside func2, using 1,2,3 

以案例2为例:

function func2(a, b, c)
   function func1()
       do something with a, b, c eventhough they are not args of func1
       return result
   end
   result = func1()
   ...
end

func2(1,2,3)

您还可以将嵌套函数添加到作为参数传递的表对象(类),但我认为这是案例 1 的变体。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-05
    • 2020-03-24
    • 2016-11-04
    • 2015-07-03
    • 2023-04-03
    • 2016-07-01
    • 2021-07-17
    • 2012-12-25
    相关资源
    最近更新 更多