- 按键认证导师
- 513852
- 3624
- 47
- 4633 朵
- 28052 个
- 6157 个
- 190000
- 2010-10-09
|
1#
t
T
发表于 2022-02-23 17:33
|
|只看楼主
函数的定义 在按键精灵中调用插件命令的本质是执行了function函数代码,所以本贴教程非常重要。 在Lua中,函数是第一类值,也就是说与数值、字符串等常见类型具有同等权限,它也可以赋值给变量之类的,例如:
- -- 与按键类似的函数定义方式
- function add(a, b) -- add是自定义函数名, a和b是参数
- -- return关键字是用于函数的返回值
- -- 类似于按键精灵中的函数名 = 返回值
- return a + b
- end
- --调用执行方法为函数名后面带括号
- local sum = add(1, 2) -- 返回值 = 函数(参数)
复制代码 除了普通的定义函数外,由于函数属于第一类值,所以它也可以赋值给变量,例如:
- -- 与按键类似的函数定义方式
- function add(a, b) -- add是自定义函数名, a和b是参数
- -- return关键字是用于函数的返回值
- -- 类似于按键精灵中的函数名 = 返回值
- return a + b
- end
- local foo = add -- 这句代码实现了将add函数赋值给了变量foo
- -- 那么如果调用执行foo就等同于调用执行 add
- local sum = foo(1, 2)
复制代码 另外,函数除了与按键一样的定义方法外,也支持定义匿名函数后赋值给变量,例如:
- -- 定义了一个匿名函数赋值给了add变量
- local add = function (a, b)
- return a + b
- end
- -- 该函数与前面正常定义类似, 唯一区别在于递归调用时意义不同
- local sum = add(1, 2) -- 返回值 = 函数(参数)
复制代码 除此之外,lua中所有关键字命令也可以赋值给变量,例如:
- -- 将print()打印命令赋值给变量p
- local p = print
- p("打印一段内容") -- 实现了修改自带命令名称的功能
复制代码 利用上述的匿名函数特性,在函数内部我们还可以再定义一个函数,例如
- -- 定义一个函数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中函数调用语法是 函数名(参数) 或 返回值变量 = 函数名(参数)。跟调用命令语法是一样的,因为命令的本质也是一个函数。 没有参数的话,可以不写参数,但是括号一定要有,没有返回值的话,可以不写返回值。 特别要注意一点,函数必须要先定义,然后才能调用,不像按键精灵可以把函数定义写在任何位置!
函数的参数 函数参数是默认可选的,即调用时不强制要求填写所有参数,这对我们接下来优化按键精灵命令提供了非常大的帮助。
- -- 定义一个局部函数
- 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
- -- 注意, 无法省略第一个参数, 直接填第二个参数, 办不到!
复制代码 除了所有参数可选外,还支持可变长参数,也就是无论你填写几个参数都行。 可变长参数是通过三个小数点(...)实现的功能,函数中通过表或其他形式接收参数。
- -- 可变长参数可以与普通参数混用, 也可以单独使用
- -- 但是请务必记住, 可变长参数必须填写在最后一个参数位置!
- 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必须写在语句块结束位置,例如end、else、until之前的最后一句,写在其他位置会报错,而按键则没这个限制 2) return会退出函数,后面代码均不会再执行,而按键代码会继续执行 3) return支持多个返回值,而按键仅支持一个 具体我们阅读以下列子
- return -- 必须在语句块结束位置,直接写在这里会报错
- do -- 这里的do...end没有特殊含义, 仅代表一个语句块
- return -- 这里就可以写返回, 不会报错, 因为下一句是end
- end
- -- 如果无法理解哪部分是语句块
- -- 那么只要记住return一般写在end/else/until这3个的前一句,其他位置大部分都会报错
- -- 当上面的return执行后,接下来代码都不会再被执行了
- -- 有时候函数调试也会用到这个技巧,执行直接跳过后面代码
复制代码 下面我们提供多个返回值的例子
- -- 定义一个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
- -- 上面多个返回值写法等同于变量的连续赋值, 详见前面变量教程帖子
复制代码
总结 我们的lua基本语法到这里结束了,后续我们将开始制作插件命令了,建议大家先熟读本贴开头的《按键精灵手机版插件的开发标准草案》内容,以方便快速进入开发插件状态。
-
-
c8.png
(, 下载次数:0)
(2022/2/23 17:33:46 上传)
|