当前位置: 首页 > news >正文

[按键安卓ios脚本辅助插件开发]数组排序函数例子

按键安卓ios工具辅助脚本插件开发教程,教程目的是让大家掌握Lua基本语法与按键精灵手机版的插件开发制作。

在按键精灵中排序需要我们自己写算法实现,例如快速排序,冒泡排序等,而在Lua中有内置的table.sort()排序命令。
这个命令比较特殊,第一个参数是传入数组,而第二个参数是传入一个匿名函数,通过这个匿名函数返回值来决定排序规则。
下面是插件完整源码。

  1. local _zimao = {} --这是内部私有table函数
  2. local zimao = {} --这是对外公开table函数
  3. QMPlugin = zimao --通过这行代码, 实现将zimao表中所有函数对外公开
  4. _zimao.version = "20220310" --插件版本号, 方便自己记忆
  5. local function try(block) -- 保护执行函数
  6. local tablejoin = function (...)
  7. local result = {}
  8. for _, t in ipairs({...}) do
  9. if type(t) == "table" then
  10. for k, v in pairs(t) do
  11. if type(k) == "number" then table.insert(result, v)
  12. else result[k] = v end
  13. end
  14. else
  15. table.insert(result, t)
  16. end
  17. end
  18. return result
  19. end
  20. -- get the try function
  21. local try = block[1]
  22. assert(try)
  23. -- get catch and finally functions
  24. local funcs = tablejoin(block[2] or {}, block[3] or {})
  25. -- try to call it
  26. local result_error = {}
  27. local results = {pcall(try)}
  28. if not results[1] then
  29. -- run the catch function
  30. if funcs and funcs.catch then
  31. result_error = {funcs.catch(results[2])}
  32. end
  33. end
  34. -- run the finally function
  35. if funcs and funcs.finally then
  36. local result_fin = {funcs.finally(table.unpack(results))}
  37. if #result_fin > 0 then
  38. return table.unpack(result_fin)
  39. end
  40. end
  41. -- ok?
  42. if results[1] and #results > 1 then
  43. return table.unpack(results, 2, #results)
  44. else
  45. if #result_error > 0 then
  46. return table.unpack(result_error)
  47. else
  48. return nil
  49. end
  50. end
  51. end
  52. local function catch(block) --异常捕获函数
  53. return {catch = block[1]}
  54. end
  55. local function finally(block) --最终必定执行函数
  56. return {finally = block[1]}
  57. end
  58. -- 常用的内部函数, 不加入私有table中, 直接定义使用
  59. local function traceprint(...) --调用按键精灵的调试输出命令
  60. if QMPlugin then -- 在Lua调试环境下, QMPlugin变量的值是我们插件公开table函数值, 而在按键精灵调试运行环境下, 该变量值被替换为nil
  61. print(...)
  62. else
  63. -- 获取可变长参数的第一个参数值
  64. local line = select(1, ...)
  65. -- 如果第一个参数是字符串, 并且符合格式 _数字 , 则判定为行号意思
  66. if type(line) == "string" and line:match("^%_%d+$") then
  67. -- 第一个参数按照格式 _数字: 传入TracePrint中可实现打印行号功能
  68. LuaAuxLib.TracePrint(line .. ":", table.concat({...}, " ", 2, select("#", ...)))
  69. elseif line == ":" and #{...} > 1 then
  70. -- 第一个参数是冒号 : 时, 表示直接打印输出数据
  71. LuaAuxLib.TracePrint(":", table.concat({...}, " ", 2, select("#", ...)))
  72. else
  73. -- 其他的情况下则加上前缀后, 进行正常输出
  74. LuaAuxLib.TracePrint(":","紫猫学院测试插件:", ...)
  75. end
  76. end
  77. end
  78. -- 实现获取变量信息的插件函数, 需对外公开, 所以使用zimao前缀
  79. function zimao.VarInfo(...)
  80. -- 防止无法获取nil参数
  81. local paramCount = select("#", ...)
  82. local varType, printStr, t = "", "", {}
  83. for i = 1, paramCount do
  84. local v = select(i, ...)
  85. try {
  86. function()
  87. varType = type(v)
  88. if varType == "table" then
  89. printStr = "【" .. varType .." " .. tostring(#v) .. "】" .. LuaAuxLib.Encode_GetJsonLib():encode(v)
  90. elseif varType == "number" or varType == "string" then
  91. printStr = "【" .. varType .." " .. tostring(#tostring(v)) .. "】" .. tostring(v)
  92. elseif varType == "boolean" or varType == "null" then
  93. printStr = "【" .. varType .."】" .. tostring(v)
  94. else
  95. printStr = "【" .. varType .."】 未知数据,无法查看!"
  96. end
  97. table.insert( t, #t + 1, printStr )
  98. end,
  99. catch {
  100. function (errors)
  101. -- 下面这个traceprint是我们上面定义过的内部输出命令,注意大小写
  102. traceprint("发生运行时错误!错误代码:VarInfo(),错误信息:", errors)
  103. end
  104. }
  105. }
  106. end
  107. printStr = table.concat( t, ", " )
  108. return printStr
  109. end
  110. -- 实现打印输出变量详细信息数据, 需对外公开
  111. function zimao.TracePrint(...)
  112. -- 通过VarInfo函数获取参数的详细数据信息
  113. local info = zimao.VarInfo(...)
  114. try {
  115. function()
  116. -- 在保护模式下打印输出这个数据内容
  117. traceprint(info)
  118. end,
  119. catch {
  120. function (errors)
  121. traceprint("发生运行时错误!错误代码:TracePrint(),错误信息:", errors)
  122. end
  123. }
  124. }
  125. end
  126. -- 遍历按键精灵的LuaAuxLib库下所有函数命令
  127. function zimao.ScanLuaAuxLib()
  128. -- 以保护模式运行, 避免插件错误造成脚本终止
  129. try {
  130. function()
  131. -- 遍历LuaAuxLib内的内容
  132. for k, v in pairs(LuaAuxLib) do
  133. -- 使用自定义函数traceprint在按键精灵中打印函数名
  134. traceprint("名称: " .. k, "类型: " .. type(v))
  135. end
  136. end,
  137. catch {
  138. function (errors)
  139. traceprint("发生运行时错误!错误代码:ScanLuaAuxLib(),错误信息:", errors)
  140. end
  141. }
  142. }
  143. end
  144. -- 数组排序, false为升序, true为降序, 省略默认为false
  145. function zimao.Sort(list, comp)
  146. return try {
  147. function ()
  148. -- 定义排序规则函数
  149. local f = function(a, b)
  150. if comp then
  151. return a > b
  152. else
  153. return a < b
  154. end
  155. end
  156. -- 返回排序结果
  157. return table.sort(list, f)
  158. end,
  159. catch {
  160. function (errors)
  161. traceprint("发生运行时错误!错误代码:Sort(),错误信息:", errors)
  162. end
  163. }
  164. }
  165. end
http://www.xdnf.cn/news/220141.html

相关文章:

  • 明远智睿SSD2351开发板:开启嵌入式开发新篇程
  • C#实现对达索(Dassault)SolidWorks中3D图纸转化为手机可直接查看预览图纸格式
  • 高级项目管理
  • 巧记英语四级单词 Unit6-下【晓艳老师版】
  • C++程序退出时的对象析构陷阱:深度解析与避坑指南
  • mysql 事务中如果有sql语句出错,会导致自动回滚吗?
  • 力扣刷题总表
  • 【Vue】 实现TodoList案例(待办事项)
  • Java高频面试之并发编程-10
  • C++之string
  • 如何在本地部署小智服务器:从源码到全模块运行的详细步骤
  • CA校验主辅小区配置及UE能力
  • 首发记忆行车方案与座舱智能管家,佑驾创新“抢跑”驾舱融合市场
  • 恒流恒压直流充电测试负载设计:构建精准化检测体系
  • 计算机基础:二进制基础14,二进制加法
  • 如何将二叉树展开为链表?两种Java实现方法对比
  • FPGA 38 ,FPGA 网络通信协议栈基础,ARP 协议深度解析与模块划分( ARP与以太网帧,以及ARP模块常用文件 )
  • 细说STM32单片机FreeRTOS互斥量及其编程实例
  • C# 导入EXCEL 报错外部表不是预期的格式错误指南方案
  • C++中的vector和list有什么区别?
  • Launcher3-实现家长管控-儿童模式-老人模式
  • 机器学习第四篇 线性回归-最小二乘法
  • 案例分享|20倍提效!水力设备电磁仿真的云端实战
  • DDoS攻击真的无解吗?
  • DeepClaude开源程序可以实现代码生成、创作诗句以及内容创作等功能
  • 详解大语言模型生态系统概念:lama,llama.cpp,HuggingFace 模型 ,GGUF,MLX,lm-studio,ollama这都是什么?
  • 【LaTex】3.8流程图绘制
  • Transformer数学推导——Q34 推导位置插值(Position Interpolation)在长文本外推中的误差上界
  • (02)Redis 的订阅发布Pub/Sub
  • Ubuntu上搭建python环境并安装第三方库