Function Lua:具有多个返回的函数

Function Lua:具有多个返回的函数,function,lua,multiple-results,Function,Lua,Multiple Results,出于某种原因,我在如何在函数中使用参数,以及以后调用该函数并返回正确参数方面遇到了一些问题。如果我想使用一个函数来找出使用的形状类型。此形状包含在形状缩写后面的数据,例如我要使用的Sq105428。快速示例: function Shape(...) -- can I use "..." or should I put "Type, Shape_data, Shape_side" inside? Shapes = {["Tri"] = 3, ["Sq"] = 4, ["Po"] = 5,

出于某种原因,我在如何在函数中使用参数,以及以后调用该函数并返回正确参数方面遇到了一些问题。如果我想使用一个函数来找出使用的形状类型。此形状包含在形状缩写后面的数据,例如我要使用的Sq105428。快速示例:

function Shape(...) -- can I use "..." or should I put "Type, Shape_data, Shape_side" inside?
    Shapes = {["Tri"] = 3, ["Sq"] = 4, ["Po"] = 5, ["Hex"] = 6}
        for k,v in pairs (Shapes) do
            Type = string.match(input, k..".*")
                if Type == k then
                    Shape_data = string.match(input,Type.."(.*)")
                    Shape_side = v
                end
        end
        return Type, Shape_data, Shape_side -- can I call for these later in my code?
end
稍后,我将调用返回的变量并使用它们。我在理解如何正确调用返回的变量时遇到问题。在我的代码中,我希望获得这三个变量并在整个代码中使用它们。我该怎么称呼他们呢

我明白:

function f() body end  ==  f = function() body end -- pg 15 PIL and helps me to understand
我还了解如何正确使用数学函数,例如:

function exp (x)
    print x^2
end

print exp(4) -- yields 16
但是,如果我想在代码的不同点使用这三个变量,那么调用我的示例的合适方式是什么呢?我在完全理解如何正确构造函数调用以及稍后如何调用函数调用时遇到了问题。它是否像:

Example = math.floor(math.pi * Shape(Shape_side) + 0.5) -- is this ok?

我很感谢你的帮助。

那不完全正确。首先,在函数中设置全局变量,但如果它们只是函数中使用的临时变量,则绝对应该使用局部变量

现在回到您的功能:

function(...)
意味着您希望在函数中接收可变数量的参数,而不将tchem分配给任何变量。要使用这些参数,需要将它们指定给命名变量,如下所示:

local side, type, data = ...
或者使用函数

您真正想要的(我想从您对
math.floor
的调用中可以看出)是告诉函数应该返回哪些数据。为此,您不需要多个参数,只需要一个参数:

function shape(what)
然后根据
what
中的内容,仅返回该数据,或者(例如),如果未提供,则返回所需的所有数据:

if what == "side" then
    return side
elseif what == "whatever" then
    return whatever
elseif not what then
    return side, whateveer
else
    return nil
end
当然,这只是一个例子。要使用多个返回值,您需要将它们存储在某个位置:

local side, whatever = shape() -- returns multiple values, because `what` is nil
local result = math.floor(math.pi * side + 0.5)
关于功能的效率:

这看起来是次优的。每次调用函数时,它都在解析提供的输入。因此,如果要获取数据,它必须遍历
输入
,如果要获取形状的侧面,它必须再次遍历
输入
。每次调用该函数时,都会重新定义一个全局
Shapes

如果函数根本不对全局变量进行操作也是最好的(例如,除了调用其他一些全局函数之外)。它使它们更加通用(例如,从提供的变量解析输入,而不是从全局输入)

我可能误解了您的功能的目的,但我会说得有点不同:

local Shapes = {["Tri"] = 3, ["Sq"] = 4, ["Po"] = 5, ["Hex"] = 6} -- create a closure

function Shape(input)
    for k, v in pairs(Shapes) do
        local type = string.match(input, k) --I thinkg with your match you'd never get past the next line
        if type then --no need to do the comparison, as type would be nil if no match is found
            return k, string.match(input, k.."(.*)"), v
        end
    end
    return nil --erroneous input, no match found
end
现在,您可以存储所需的所有数据,并在以后使用它,而无需重新调用函数并再次解析输入:

local type, data, side = Shape(userInput)
或者更好的是,让函数返回一个表并以更好的方式访问数据:

...
if type then --no need to do the comparison, as type would be nil if no match is found
    return {type = k, data = string.match(input, k.."(.*)"), side = v}
end
...
然后将数据存储为:

local userShape1 = Shape(userInput1)
local userShape2 = Shape(userInput2)
--now use the results
local result1 = math.floor(math.pi * userShape1.side + 0.5)
local result2 = math.floor(math.pi * userShape2.side + 0.5)
local dataResult1 = processShapeData(userShape1.data)
现在,这比多个本地值慢,但它更干净,imo,这很重要,如果您是Lua新手。还有一些其他东西可以使函数更好更快(比如要求输入以形状类型开始),但我不会让你感到厌烦

回到原始问题,要使用多个返回值,需要将它们存储在变量中。如果函数返回多个值,但只对一个变量赋值,则会丢弃其余数据:

local type = Shape(input) --assuming the function returns multiple values, not a table

我想我有点离题了,很抱歉。@WB谢谢你的回答。在读了几遍并与你的回答同时做了一些研究之后,我相信我对你为什么这么做有了更好的理解。但我还有一个问题。如果我将
return nil
放在
return{…}
之后,为什么
nil
不删除表中的任何返回值?@WB关于您的答案的最后一个问题。如果我存储的变量位于函数中的一个无名表中,那么第二部分(从第二部分到最后一部分)让我对存储数据然后使用它感到有点困惑。如果表没有命名,它是否会自动变成
function\u name{}
?如果我有多个变量(在包含我的
foo{}
中的变量的函数之外);我将如何引用它们?例如
local side=shape(input)
local shapes=shape(input)
,等等…@Pwrcdr87我不确定我是否理解你的问题。如果一个函数执行
return
,它将在那一行结束执行。因此,你在后面放置的所有内容都不会被执行。至于第二部分,如果一个表没有命名,它是一个临时变量。这通常用于将参数传递给函数返回值@WB感谢您的帮助。通过我的返回问题,在您的
函数形状(输入)
示例中,您有
返回k,string.match(输入,k...(.*)),v end end end
然后
返回nil end
。我完全理解
返回k,string.match(输入,k...(.*)的原因,v
。但是,如果我以
return nil
结束整个函数,调用变量时,我是否总是会收到变量值的
nil