2019 年 7 月 9 日
无需原生代码扩展 Corona 库
这是 Corona 长期用户 Matthew Webster 的客座文章。
虽然 Corona 简单、强大且拥有许多有用的 API,但总会有额外的一件事。通常,这一件事似乎足够简单,可以整合到现有的 Lua API 中,但可能看起来被遗忘了。
本教程将向您展示如何:
- 向现有库添加新功能
- 扩展现有功能
Corona 库 API
Corona 中的所有功能都由库 API 提供。其文档在此处。
如果我们看一下 'string.*'
API,我们可以看到一系列函数,例如:
- string.find()
- string.format()
- string.gsub()
- string.len()
- string.lower()
碰巧的是,所有这些函数都不是用 Lua 编写的,它们是 C++(跨平台)、Objective-C(用于 iOS)或 Java(用于 Android)中提供的较低级别函数的句柄。'math.*'
API 等库也是如此。
但是,一些 API 完全用 Lua 提供,例如 Corona 的 'widget.*'
API 完全用 Lua 编写。Corona Labs 甚至提供了原始源代码!
无论 Corona Labs 工程师选择使用哪种代码实现方式,事实仍然是,在我们的 Lua 世界中,每个函数都紧紧地受限于 Lua 的规则。事实上,每个库(包括 'string.*'
API)实际上都是一个表。没错:'string'
是一个表,上面定义的所有函数都是该表的成员。
这使我们能够轻松地做一些非常聪明的事情。
一个有用的函数
我们要学习的第一件事是如何将我们自己的函数添加到 Corona SDK 自己的 API 库中。我们为什么要这样做呢?好吧,假设你编写了一个非常有用的函数,它可以删除字符串开头和结尾的空格。在大多数语言中,这通常称为 'trim()'
1 2 3 |
local function trim( str ) return (str:gsub("^%s*(.-)%s*$", "%1")) end |
不用担心函数内部实际发生了什么。只需知道你已经编写了它,它很棒,并且当你想让一个字符串开头和结尾有非常烦人的空格时,它工作得非常好。
print( trim( " Hello World! " ) )
输出
Hello World!
许多 Corona 开发人员的通常做法是将此 'trim()'
函数放入一个库文件中,例如
“utils.lua
”。我们要做的是让它更容易记住并且在类别上更准确……这个函数是
一个字符串函数,因此应该像其他字符串函数一样访问它。
添加到 Corona 的 API
要明确的是,我们的函数位于名为 "utils.lua"
的文件中,因此我们希望在该文件中完成所有工作。当然,"utils.lua"
将通过标准的 'require'
调用加载到我们的 "main.lua"
的内存中
require("utils")
"utils.lua"
中的函数如下所示
1 2 3 |
local function trim( str ) return (str:gsub("^%s*(.-)%s*$", "%1")) end |
因此,让我们将此函数添加到 'string.*'
API。在 "utils.lua"
中,在我们定义函数之后,我们使用一个标准的表值赋值(这是神奇的部分)
string.trim = trim
就是这样。很简单。
你现在可以在代码中的任何位置调用 'string.trim(" Hello World! ")'
,它将打印
Hello World!
库的优点
假设我们定义了一个字符串
local str = " Hello World! "
在字符串 API 中拥有 'trim()'
函数的优点在于,我们现在可以将该函数作为任何字符串变量的成员来调用
print( str:trim() )
将输出
Hello World!
这是因为 'string'
库通常表示字符串变量。
重要的是要注意,这不会将你的 trim 函数添加到每个人的 Corona string.*
库中,也不会使其可用于你的下一个项目。你需要继续 require 你的 util.lua
文件。但这里的想法是
string.trim()
比
util.trim()
在语义上更有意义。 希望这个简单的小技巧可以使你使用 Corona 进行开发时更加轻松。
抱歉,评论表单目前已关闭。