出于某种原因,我遇到了绕着在函数中使用参数的适当方式的问题,然后调用该函数并返回正确的参数。如果我想使用函数来找出使用的形状类型。这个形状包含形状缩写之后的数据,例如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?
我很感激帮助。
答案 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