2019 年 9 月 13 日
Corona 中的函数和返回语句
在各种 Corona 支持渠道上提出了一个问题:“
return
语句是什么,我什么时候需要使用它?” 在回答这个问题之前,您需要了解什么是函数以及 Lua 如何使用它们。
函数是可以重用的代码块。考虑更换汽车轮胎
- 从后备箱取出千斤顶、套筒扳手和备用轮胎
- 将套筒扳手放在螺母 #1 上
- 逆时针旋转直到螺母脱落
- 将螺母放在安全的地方
- 将套筒扳手放在螺母 #2 上
- 逆时针旋转直到螺母脱落
- 将螺母放在安全的地方
- 将套筒扳手放在螺母 #3 上
- 逆时针旋转直到螺母脱落
- 将螺母放在安全的地方
- 将套筒扳手放在螺母 #4 上
- 逆时针旋转直到螺母脱落
- 将螺母放在安全的地方
- 将套筒扳手放在螺母 #5 上
- 逆时针旋转直到螺母脱落
- 将螺母放在安全的地方
- 用千斤顶顶起汽车
- 拆下扁平轮胎
- 装上备用轮胎
等等。
计算机代码以线性方式执行。如果您要用计算机代码写出这个,您最终会多次重复自己。将螺母移除代码放入一个函数中更有意义。考虑以下伪代码
1 2 3 4 |
函数 removeLugNut( lugNutNunber ) 将套筒扳手放在螺母 # lugNutNumber上 逆时针旋转直到螺母脱落. 将螺母放在 一个 安全的地方 |
这会将我们的算法简化为
- 从后备箱取出千斤顶、套筒扳手和备用轮胎
- 对于每个 lugNutNumber
- removeLugNut( lugNutNumber)
- 用千斤顶顶起汽车
- 拆下扁平轮胎
- 装上备用轮胎
代码更加紧凑。它遵循一个主要的开发者原则,称为 DRY - 不要重复自己。
函数可以在 Corona 应用程序中以多种方式使用。让我们看一个基本示例
1 2 3 |
local function movePlayer() player.x = player.x + 1 end |
此函数不需要任何信息。它使用一个现有的已定义对象:player
,并将其 .x
位置递增 1。它不接受任何参数,也不将任何数据传递回调用代码。您可能会在另一个每时钟滴答运行一次的函数中使用它
1 2 3 |
local function enterFrameListener() movePlayer() end |
由于您没有在括号内放置任何内容,因此您没有向该函数发送任何内容。但是您可以轻松地将信息传递给该函数。您可能希望使此函数更通用一些。您可以使用 moveObject
代替 movePlayer
。您还可以提供速度
1 2 3 4 5 6 7 |
local function moveObject( object, speed ) object.x = object.x + speed end local function enterFrameListener() moveObject( player, 1) end |
现在您知道如何将信息传递给函数了,那么如何取回信息呢?首先,并非所有函数都需要返回数据,但是当您这样做时,您可以使用 Lua 的 return
语句。
在机器代码级别,以上所有函数都有一个隐含的 return
语句。为了方便 Lua 开发人员,如果您不需要,则无需指定一个,因此
1 2 3 |
local function moveObject( object, speed ) object.x = object.x + speed end |
和
1 2 3 4 |
local function moveObject( object, speed ) object.x = object.x + speed return nil end |
是相同的。
return
语句有两个主要目的。首先,它可以用于强制函数提前结束。让我们看一个例子
1 2 3 4 5 6 7 |
local function moveObject( object, speed ) 如果 object == nil 或 object.x == nil 则 -- 这不是显示对象,因此退出该函数而不执行任何其他工作 return 结束 object.x = object.x + speed end |
由于代码没有有效的对象来更改 x
的值,您可以退出该函数并避免潜在的错误。
return
语句的第二个用途是将信息传递回调用该函数的代码。该信息可以是简单的成功或失败指示器,或者可以传递回更有用的值。让我们看一下修改上述函数的简单成功/失败情况。
1 2 3 4 5 6 7 8 |
local function moveObject( object, speed ) 如果 object == nil 或 object.x == nil 则 -- 这不是显示对象,因此退出该函数而不执行任何其他工作 return false -- 让调用代码知道它失败了 结束 object.x = object.x + speed return true -- 该函数成功,因此让调用者知道。 end |
要接收数据,调用该函数的代码可以将返回值存储在变量中,或者在条件测试中对其进行测试。
1 2 3 4 5 |
local function enterFrameListener() 如果 非 moveObject( player, 1) 则 print("由于对象不是显示对象,因此对象移动失败") 结束 end |
有时您需要捕获这些值。让我们看一下这个简单的将两个数字相加的函数
1 2 3 4 5 6 7 |
local function addTwoNumbers( num1, num2 ) local sum = num1 + num2 return sum end local sum = addTwoNumbers(10, 20) print("The sum is", sum) |
现在你可以将数据传递给函数,也可以使用 return 语句接收返回的信息。
大多数编程语言只能返回一个值(虽然它可以是一个包含多个值的表、字典或列表)。但是,Lua 允许你返回多个值。让我们回到 moveObject
函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
local function moveObject( object, speed ) 如果 object == nil 或 object.x == nil 则 -- 这不是显示对象,因此退出该函数而不执行任何其他工作 return false, "This does not appear to be a display object" -- 让调用代码知道它失败了 结束 object.x = object.x + speed return true, "Success" -- 函数成功执行,所以让调用者知道。 end local function enterFrameListener() local success, message = moveObject( player, 1) if not success then print( message ) 结束 end |
从本教程中你可以看到 return
语句在你的 Corona 冒险中是多么有用。
抱歉,评论表单目前已关闭。