1

我正在尝试创建一个包含本地函数的函数。主函数将接收来自外部源的输出,并且其中的函数需要转换该输入并返回结果以供以后使用。我的问题是我目前尝试这样做的方式,当我尝试将我的第一个本地函数放入主函数中时,我继续得到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)? 我可以在没有嵌套函数的情况下得到我想要的响应。但是当我尝试详细说明我想收到的响应并将该函数放在全局函数中时,我开始得到这些响应。每当我尝试在其他函数中使用函数时,这似乎都是我的问题。我可以创建两个单独的全局函数并打印其中一个函数的结果。但是当我尝试在另一个中使用一个的那一刻,我把自己搞砸了。任何可以花一些时间帮助初学者更好地理解他做错了什么的人都会很棒!谢谢大家。

4

1 回答 1

2

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

function func1(args)
    ...
end

function func2(args)
    ...
end

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

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

以案例 1 为例:

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 的变体。

于 2014-05-15T01:45:49.980 回答