Lua:多次返回的函数

时间:2014-05-06 21:21:22

标签: 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, ["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?

我很感激帮助。

1 个答案:

答案 0 :(得分:2)

这不完全正确。首先,您要在函数中设置全局变量,但如果它们只是用于函数的临时变量,那么您肯定应该使用本地变量。

现在回到你的职能部门:

function(...)

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

local side, type, data = ...

或使用select功能。

你真正想要的是什么(我想从你对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)

关于您的功能效率:

看起来它不是最理想的。每次调用该函数时,它都会解析所提供的输入。因此,如果您想要获取数据,则必须超过input,如果您想获得形状,则必须再次检查input。每次调用该函数时,都会重新声明全局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