「按键精灵」一篇文章学会封装函数 您所在的位置:网站首页 按键精灵实例分析 「按键精灵」一篇文章学会封装函数

「按键精灵」一篇文章学会封装函数

2024-07-18 00:26| 来源: 网络整理| 查看: 265

大家好,我是公众号3分钟学堂的郭立员~

前言

从广义上说,脚本程序中每一个命令都是一个函数,但是通常我们会把用function命令封装的代码段叫做函数。

函数的核心作用就是减少代码的行数。

我们使用函数的目的是可以提高编写脚本的速度,因为原本需要很多行代码实现的功能,在封装成函数后,只需要一行调用函数的代码就可以使用,如果使用别人封装好的函数,你可以在不需要知道函数内代码是什么的情况下直接调用。

一、函数的组成部分

一个函数的定义包含4个部分:

函数名(function name)

形参列表(parameter list),函数名后面括号内的部分,允许为空

函数体(function body)

返回值(return value)

隐藏部分 返回类型(return type)

用一个简单的例子来介绍函数的组成部分

Function 加法(a,b) Dim c c = a + b 加法=c End Function 复制代码

在例子中,

①函数名是“加法”

②形参列表是(a,b)

③函数体是

Dim c c = a + b 复制代码

④返回值是“加法=c”,也就是把c的值作为函数的返回值

⑤返回类型,也就是返回值的类型,在例子中c是返回值,c是来自a和b的加法运算,所以c是数值型,那么返回类型就是数值类型。

对于按键来说并没有强制要求写上返回类型,所以这部分是可以忽略的。

二、封装函数的流程

以下我们用封装一个找图函数作为例子:

①先编写“函数体”部分的内容,因为它是函数的核心功能,每个函数之所以不同,就是因为函数体的代码不同。

所谓函数体就是我们正常编写脚本的代码,比如我们要封装一个找图函数。

它的函数体是

Dim intx,inty FindPic 0, 0, 0, 0, "Attachment:1.png","000000", 0, 0.9, intX, intY If intX > -1 And intY > -1 Then TracePrint intx,inty End If 复制代码

②填写一个函数名,封装一个无参无返回值的函数

Function 找图() Dim intx,inty FindPic 0, 0, 0, 0, "Attachment:1.png","000000", 0, 0.9, intX, intY If intX > -1 And intY > -1 Then TracePrint intx,inty End If End Function 复制代码

很多新手朋友写到这一步就完事了,在语法和用法上没有错误,但是定义的是“死函数”,函数内部都是不变的,并且在调用函数时没有反馈。

③给函数添加形参列表

什么是形参、什么是实参?

形参:找图(a)

实参:找图("1.png")

在脚本中,括号里面是变量的就是形参,一般是用在定义函数时

Function 找图(a)

在脚本中,括号里面是字符串、数值或者其他非变量的,就是实参,一般是用在调用函数

call 找图("1.png")

为什么这一步叫添加形参列表呢?

因为形参不止有一个,可以添加无数个,至于有没有上限,在按键中我没有测试过,至少添加十几二十个形参是没问题的。

为了方便大家学习,以下所有形参和实参,我们统一写成参数。

函数的参数是可以让函数具有可变性的,比如:

找图函数,如果把图片路径名称当做参数,就可以用在不同图片上。

Function 找图(图片名称) Dim intx,inty FindPic 0, 0, 0, 0, 图片名称,"000000", 0, 0.9, intX, intY If intX > -1 And intY > -1 Then TracePrint intx,inty End If End Function 复制代码

在代码中我们用 “图片名称”代替"Attachment:1.png",在调用找图函数的时候,就不只是可以找图片1.png了,可以是任意图片了

找图("Attachment:1.png") Function 找图(图片名称) Dim intx,inty FindPic 0, 0, 0, 0, 图片名称,"000000", 0, 0.9, intX, intY If intX > -1 And intY > -1 Then TracePrint intx,inty End If End Function 复制代码

上面是图片路径整体替换,也可以局部替换,比如用“图片名称”替换“1.png”

找图("1.png") Function 找图(图片名称) Dim intx,inty FindPic 0, 0, 0, 0, "Attachment:"&图片名称,"000000", 0, 0.9, intX, intY If intX > -1 And intY > -1 Then TracePrint intx,inty End If End Function 复制代码

函数加什么参数,是根据我们的功能需要,如果在函数体中是可变的部分本质上是都可以作为参数的。

比如找图函数加个找图范围的参数:

找图(0,0,0,0,"1.png") Function 找图(x1,y1,x2,y2,图片名称) Dim intx,inty FindPic x1,y1,x2,y2, "Attachment:"&图片名称,"000000", 0, 0.9, intX, intY If intX > -1 And intY > -1 Then TracePrint intx,inty End If End Function 复制代码

因为可变性的原因,同一个功能不同人定义的函数参数未必是一样的,有的人定义的函数有1个参数,有的人定义的函数有10个参数。

两者都是正确的,同时在使用函数过程中,也可以随时添加参数以满足需要。

在网上还有很多老师讲到把数组当做函数的参数,这种是用在有很多参数的情况,就是把多个参数放到一个数组里面,每一个参数对应一个数组下标。

Dim 图1={0,0,0,0,"1.png"} 找图(图1) Function 找图(arr) Dim intx,inty FindPic arr(0),arr(1),arr(2),arr(3), "Attachment:"&arr(4),"000000", 0, 0.9, intX, intY If intX > -1 And intY > -1 Then TracePrint intx,inty End If End Function 复制代码

在函数中参数只有一个数组类型的参数arr,它是所有参数的合集,在函数体内部还是要把每一个数组下标内容写到对应位置,形成一一对应的关系。

这种使用方式一般是在脚本开始部分定义大量的数组参数,后期使用的时候,直接填写对应的数组名称当做参数。

Dim 图1={0,0,0,0,"1.png"} Dim 图2={0,0,0,0,"2.png"} Dim 图3={0,0,0,0,"3.png"} Dim 图4={0,0,0,0,"4.png"} Dim 图5={0,0,0,0,"5.png"} 找图(图1) Function 找图(arr) Dim intx,inty FindPic arr(0),arr(1),arr(2),arr(3), "Attachment:"&arr(4),"000000", 0, 0.9, intX, intY If intX > -1 And intY > -1 Then TracePrint intx,inty End If End Function 复制代码

注意:在按键中自定义函数不能有可省略参数,也就是你定义几个参数,调用函数就必须填写几个,否则就会报语法错误。

④返回值

返回值的写法很简单,就是函数名=要返回的内容

需要注意的是返回值的有效性

比如:找图函数的返回值可以是找图得到坐标,这就是一个有效的返回值。

如果找图函数中包含了点击找到位置的功能,此时返回值写成是否找到图(是否点击)的true或者false可能会更好一些。

返回值还有一个相对难点,就是返回值是多个值。

还是找图函数的例子,如果返回值是坐标,那么就是2个值,intx,inty

这种情况写法有两种:一是多个返回内容拼接在一起,用分隔符号隔开。二是用数组,把每一个返回内容放入数组当中。

两者不同之处是返回值的类型,前者是字符串类型,后者是数组类型。

a.拼接返回值写法

b.数组返回值写法

Dim 返回数组=找图("Attachment:1.png") TracePrint 返回数组(0) TracePrint 返回数组(1) Function 找图(图片名称) Dim intx,inty Dim arr() FindPic 0, 0, 0, 0, 图片名称,"000000", 0, 0.9, intX, intY If intX > -1 And intY > -1 Then arr(0) = intx arr(1) = inty 找图 = arr End If End Function 复制代码

三、局部变量和全局变量

在函数内部用dim 定义的变量就是局部变量,在函数外面定义的就是全局变量。

优先级:在函数内部局部变量优先级高于全局变量,也就是同一个变量,在函数内部和函数外部同时定义了,函数调用的是内部定义的变量。

Dim a=1 Call 函数() Function 函数() Dim a=2 TracePrint a End Function 复制代码

调试输出结果:a=2

考虑到优先级的原因,如果函数内部想要调用函数外部定义的全局变量,就不能再函数内定义此变量(局部变量)。

Dim a=1 Call 函数() Function 函数() TracePrint a End Function 复制代码

调试输出结果:a=1

当只有全局变量时,这个变量既可以在函数内部使用,也可以在函数外部使用,利用这个特性,我们在需要多个返回值的时候,用全局变量代替返回值。

Dim x,y 找图 ("Attachment:1.png") TracePrint x,y Function 找图(图片名称) Dim intx,inty FindPic 0, 0, 0, 0, 图片名称,"000000", 0, 0.9, intX, intY If intX > -1 And intY > -1 Then x = intx y = inty End If End Function 复制代码

用全局变量x,y代替返回值,在函数中把intx、inty分别复制给x、y,在函数外面直接输出x、y即可。

这种用全局变量代替的方式是假的返回值,对于函数本身返回值可以写true或者false

找到图的情况

找图=true

没找到图的情况

找图=false

有个是否找到图的返回值,可以加上判断

Dim x,y If 找图("Attachment:1.png") Then TracePrint x,y Else TracePrint "没找到图" End If Function 找图(图片名称) Dim intx,inty FindPic 0, 0, 0, 0, 图片名称,"000000", 0, 0.9, intX, intY If intX > -1 And intY > -1 Then 找图=true x = intx y = inty Else 找图=false End If End Function 复制代码

总结:

函数自定义尽可能把函数的4部分都写全,对于多个返回值的情况,可以用拼接、数组方式作为返回值,也可以用全局变量代替。

记住函数的目的节省代码提高编写速度,如果你愿意所有自定义函数都是可以省略的。

=正文完=



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有