找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1510|回复: 1

[教程源码] [Lua插件开发]04. function函数

[复制链接]
  • 打卡等级:坠落山崖

1081

主题

2107

回帖

4289

积分

院长

鲜花
7
猫粮
7489
QQ
发表于 2022-2-23 17:17:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本系列教程目的是让大家掌握Lua基本语法与按键精灵手机版的插件开发制作,丰富按键精灵生态环境,让按键精灵变得更加强大!
本教程中部分知识点参考《Lua程序设计》书籍,有兴趣可以自行购买→传送门
按键精灵手机版插件的开发标准草案请阅读帖子:https://zimaoxy.com/b/t-3297-1-1.html
紫猫学院也有提供Lua插件开发的VIP教学服务,有兴趣请咨询紫猫老师QQ345911220或微信zimaoxy

函数的定义
在按键精灵中调用插件命令的本质是执行了function函数代码,所以本贴教程非常重要。
在Lua中,函数是第一类值,也就是说与数值、字符串等常见类型具有同等权限,它也可以赋值给变量之类的,例如:
[Lua] 纯文本查看 复制代码
-- 与按键类似的函数定义方式
function add(a, b) -- add是自定义函数名, a和b是参数
    -- return关键字是用于函数的返回值
    -- 类似于按键精灵中的函数名 = 返回值
    return a + b 
end

--调用执行方法为函数名后面带括号
local sum = add(1, 2)   -- 返回值 = 函数(参数)

除了普通的定义函数外,由于函数属于第一类值,所以它也可以赋值给变量,例如:
[Lua] 纯文本查看 复制代码
-- 与按键类似的函数定义方式
function add(a, b) -- add是自定义函数名, a和b是参数
    -- return关键字是用于函数的返回值
    -- 类似于按键精灵中的函数名 = 返回值
    return a + b 
end

local foo = add -- 这句代码实现了将add函数赋值给了变量foo
-- 那么如果调用执行foo就等同于调用执行 add
local sum = foo(1, 2)

另外,函数除了与按键一样的定义方法外,也支持定义匿名函数后赋值给变量,例如:
[Lua] 纯文本查看 复制代码
-- 定义了一个匿名函数赋值给了add变量
local add = function (a, b)
    return a + b 
end
-- 该函数与前面正常定义类似, 唯一区别在于递归调用时意义不同
local sum = add(1, 2)   -- 返回值 = 函数(参数)

除此之外,lua中所有关键字命令也可以赋值给变量,例如:
[Lua] 纯文本查看 复制代码
-- 将print()打印命令赋值给变量p
local p = print
p("打印一段内容") -- 实现了修改自带命令名称的功能

利用上述的匿名函数特性,在函数内部我们还可以再定义一个函数,例如
[Lua] 纯文本查看 复制代码
-- 定义一个函数rndnum, 有两个参数
function rndnum(a, b)
    -- 定义一个函数内部有效的局部函数sortnum
    local sortnum = function(x, y)
        if x > y then
            return y, x
        else
            return x, y
        end
    end
    -- 调用该局部函数, 这里用到了两个返回值, 后面帖子对此会有讲解
    local min, max = sortnum(a, b)
    -- 实现随机数
    return math.random(min, max)
end

-- 调用函数
n = rndnum(1, 10)

甚至你还可以重新对关键字命令赋值,实现修改其功能,具体这里就不展开讲解了。


函数的调用
Lua中函数调用语法是 函数名(参数)返回值变量 = 函数名(参数)。跟调用命令语法是一样的,因为命令的本质也是一个函数。
没有参数的话,可以不写参数,但是括号一定要有,没有返回值的话,可以不写返回值。
特别要注意一点,函数必须要先定义,然后才能调用,不像按键精灵可以把函数定义写在任何位置!


函数的参数
函数参数是默认可选的,即调用时不强制要求填写所有参数,这对我们接下来优化按键精灵命令提供了非常大的帮助。
[Lua] 纯文本查看 复制代码
-- 定义一个局部函数
local function add(a, b)
    -- 当省略不填写参数时, 参数为nil
    -- 这里实现了可选参数的默认值功能
    if a == nil then a = 0 end
    if b == nil then b = 0 end
    return a + b
end

sum = add() -- 两个参数都省略, 返回0
sum = add(1)  -- 填写第一个参数, 返回1
sum = add(1, 2) -- 填写两个参数, 返回3
-- 注意, 无法省略第一个参数, 直接填第二个参数, 办不到!

除了所有参数可选外,还支持可变长参数,也就是无论你填写几个参数都行。
可变长参数是通过三个小数点(...)实现的功能,函数中通过表或其他形式接收参数。
[Lua] 纯文本查看 复制代码
-- 可变长参数可以与普通参数混用, 也可以单独使用
-- 但是请务必记住, 可变长参数必须填写在最后一个参数位置!
function getSum(...)
    local args = {...}  -- 使用表的构造器{}将可变长参数赋值给数组变量args
    local sum = 0
    for i = 1, #args do    -- 获取数组args的方式是在名称前面加#号
        sum = sum + args[i]  -- 计算所有参数之和
    end
    return sum -- 返回参数结果
end

local s = getSum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) -- 1加到10的结果是55



函数的返回值
return是返回值的关键字命令,类似于按键精灵的函数名=返回值写法,但是有较多的不同之处。
1) return必须写在语句块结束位置,例如endelseuntil之前的最后一句,写在其他位置会报错,而按键则没这个限制
2) return会退出函数,后面代码均不会再执行,而按键代码会继续执行
3) return支持多个返回值,而按键仅支持一个
具体我们阅读以下列子
[Lua] 纯文本查看 复制代码
return -- 必须在语句块结束位置,直接写在这里会报错
do   -- 这里的do...end没有特殊含义, 仅代表一个语句块
    return  -- 这里就可以写返回, 不会报错, 因为下一句是end
end
-- 如果无法理解哪部分是语句块
-- 那么只要记住return一般写在end/else/until这3个的前一句,其他位置大部分都会报错
-- 当上面的return执行后,接下来代码都不会再被执行了
-- 有时候函数调试也会用到这个技巧,执行直接跳过后面代码

下面我们提供多个返回值的例子
[Lua] 纯文本查看 复制代码
-- 定义一个foo函数, 参数要求传入数组
function foo(t)
    -- 返回数组参数t的第一个和最后一个成员值
    return t[1], t[#t]
end

local arr = {1, 2, 3, 4}
a = foo(arr) -- 接收第一个返回值的写法, 返回了数字1
a, b = foo(arr)  -- 接收两个返回值的写法, a对应数字1, b对应数字4
-- 上面多个返回值写法等同于变量的连续赋值, 详见前面变量教程帖子

楼主热帖
  • 打卡等级:初涉江湖

0

主题

23

回帖

23

积分

按键电脑&手机班学员

鲜花
0
猫粮
189
发表于 2022-5-1 13:45:42 | 显示全部楼层
好 不错 老知识新总结 玩出新花样 活出新潇洒 !
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|紫猫编程学园

GMT+8, 2024-4-20 00:38

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表