• 按键公众号 :
按键精灵电脑版
立即下载

软件版本:2014.06
软件大小:22.9M
更新时间:2021-12-03

按键精灵安卓版
立即下载

软件版本:3.7.2
软件大小:46.2M
更新时间:2023-05-10

按键精灵iOS版
立即下载

软件版本:1.8.0
软件大小:29.2M
更新时间:2023-03-21

按键手机助手
立即下载

软件版本:3.8.0
软件大小:262M
更新时间:2023-05-30

快捷导航

登录 后使用快捷导航
没有帐号? 注册

发新话题 回复该主题

[紫猫] [按键手机插件开发]04. function函数的定义与调用 [复制链接]

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



函数的定义
在按键精灵中调用插件命令的本质是执行了function函数代码,所以本贴教程非常重要。
在Lua中,函数是第一类值,也就是说与数值、字符串等常见类型具有同等权限,它也可以赋值给变量之类的,例如:

  1. -- 与按键类似的函数定义方式
  2. function add(a, b) -- add是自定义函数名, a和b是参数
  3. -- return关键字是用于函数的返回值
  4. -- 类似于按键精灵中的函数名 = 返回值
  5. return a + b
  6. end

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

除了普通的定义函数外,由于函数属于第一类值,所以它也可以赋值给变量,例如:

  1. -- 与按键类似的函数定义方式
  2. function add(a, b) -- add是自定义函数名, a和b是参数
  3. -- return关键字是用于函数的返回值
  4. -- 类似于按键精灵中的函数名 = 返回值
  5. return a + b
  6. end

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

另外,函数除了与按键一样的定义方法外,也支持定义匿名函数后赋值给变量,例如:

  1. -- 定义了一个匿名函数赋值给了add变量
  2. local add = function (a, b)
  3. return a + b
  4. end
  5. -- 该函数与前面正常定义类似, 唯一区别在于递归调用时意义不同
  6. local sum = add(1, 2) -- 返回值 = 函数(参数)
复制代码

除此之外,lua中所有关键字命令也可以赋值给变量,例如:

  1. -- 将print()打印命令赋值给变量p
  2. local p = print
  3. p("打印一段内容") -- 实现了修改自带命令名称的功能
复制代码

利用上述的匿名函数特性,在函数内部我们还可以再定义一个函数,例如

  1. -- 定义一个函数rndnum, 有两个参数
  2. function rndnum(a, b)
  3. -- 定义一个函数内部有效的局部函数sortnum
  4. local sortnum = function(x, y)
  5. if x > y then
  6. return y, x
  7. else
  8. return x, y
  9. end
  10. end
  11. -- 调用该局部函数, 这里用到了两个返回值, 后面帖子对此会有讲解
  12. local min, max = sortnum(a, b)
  13. -- 实现随机数
  14. return math.random(min, max)
  15. end

  16. -- 调用函数
  17. n = rndnum(1, 10)
复制代码

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


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


函数的参数
函数参数是默认可选的,即调用时不强制要求填写所有参数,这对我们接下来优化按键精灵命令提供了非常大的帮助。

  1. -- 定义一个局部函数
  2. local function add(a, b)
  3. -- 当省略不填写参数时, 参数为nil
  4. -- 这里实现了可选参数的默认值功能
  5. if a == nil then a = 0 end
  6. if b == nil then b = 0 end
  7. return a + b
  8. end

  9. sum = add() -- 两个参数都省略, 返回0
  10. sum = add(1) -- 填写第一个参数, 返回1
  11. sum = add(1, 2) -- 填写两个参数, 返回3
  12. -- 注意, 无法省略第一个参数, 直接填第二个参数, 办不到!
复制代码

除了所有参数可选外,还支持可变长参数,也就是无论你填写几个参数都行。
可变长参数是通过三个小数点(...)实现的功能,函数中通过表或其他形式接收参数。

  1. -- 可变长参数可以与普通参数混用, 也可以单独使用
  2. -- 但是请务必记住, 可变长参数必须填写在最后一个参数位置!
  3. function getSum(...)
  4. local args = {...} -- 使用表的构造器{}将可变长参数赋值给数组变量args
  5. local sum = 0
  6. for i = 1, #args do -- 获取数组args的方式是在名称前面加#号
  7. sum = sum + args[i] -- 计算所有参数之和
  8. end
  9. return sum -- 返回参数结果
  10. end

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



函数的返回值
return是返回值的关键字命令,类似于按键精灵的函数名=返回值写法,但是有较多的不同之处。
1) return必须写在语句块结束位置,例如endelseuntil之前的最后一句,写在其他位置会报错,而按键则没这个限制
2) return会退出函数,后面代码均不会再执行,而按键代码会继续执行
3) return支持多个返回值,而按键仅支持一个
具体我们阅读以下列子

  1. return -- 必须在语句块结束位置,直接写在这里会报错
  2. do -- 这里的do...end没有特殊含义, 仅代表一个语句块
  3. return -- 这里就可以写返回, 不会报错, 因为下一句是end
  4. end
  5. -- 如果无法理解哪部分是语句块
  6. -- 那么只要记住return一般写在end/else/until这3个的前一句,其他位置大部分都会报错
  7. -- 当上面的return执行后,接下来代码都不会再被执行了
  8. -- 有时候函数调试也会用到这个技巧,执行直接跳过后面代码
复制代码

下面我们提供多个返回值的例子

  1. -- 定义一个foo函数, 参数要求传入数组
  2. function foo(t)
  3. -- 返回数组参数t的第一个和最后一个成员值
  4. return t[1], t[#t]
  5. end

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



总结
我们的lua基本语法到这里结束了,后续我们将开始制作插件命令了,建议大家先熟读本贴开头的《按键精灵手机版插件的开发标准草案》内容,以方便快速进入开发插件状态。

c8.png (, 下载次数:0)

(2022/2/23 17:33:46 上传)

c8.png


【紫猫编程学院】火热招生中

教学涉及按键精灵(电脑版与手机版)、网页、游戏、办公、插件等。

报名咨询QQ: 345911220 微信:zimaoxy

紫猫学院免费教程

加入交流QQ群: 7333555


2#

学习取经

3#

,

学习

4#

88888888888888888888888888

5#

新手

6#

就大V是仓库

7#

a撒旦撒打手动as

8#

666666

9#

学习,学习下。

10#


11#

支持!

12#

请问插件中可以调用动态链接库么?

13#

dgfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgf

14#

感谢,学习一下

15#

学习学习学习,加油

16#

看看

17#

函数的定义

18#

看看看

19#

666666

20#

666

646138545198855

发新话题 回复该主题