_AB011-[中级] AHK元编程初步对象协议和_Get()
写在前面
其实我本人对"元编程"也没有什么实际应用经验,因为我之前学的语言是Java,没接触过"元编程"的概念。
AHK的元编程,至少从国内的资料来看,是没有人用过的,帮助文件又太晦涩难懂,所以很大程度的限制了它的使用。
本来我想等有实际案例了之后再写,但是觉得还是"完成大于完美",这里就发出来吧,也算是"抛砖引玉"。
这是"AHK元编程初步"系列的第一篇文章,主要是介绍对象协议和__Get(),之后将会陆续介绍更多的内容。
教程的下一步计划
"AHK元编程初步"系列完成之后,先之前的坑填上,Object,SimpleArray(集合),继承(扩展),Exception。
这些至少要涉猎一遍,之后就会出 GUI/HotKey/HotString 教程,也就是"事件驱动编程"。
学完"事件驱动编程"之后其实你就可以愉快的装逼了,因为你可以搞出框框。
屁话不多说,让我们开始吧。
对象协议
我尽量的说得通俗易懂一些,如果你没有使用Object和Base的基础,有些地方可能是有一些难懂的,只要提到陌生的概念,我就会说一下。
简单解释protocal和元编程
对象协议(object-protocol)是什么意思?如果你有其他的编程基础,比如Java/C#,那么我可以告诉你,这个protocol其实就是interface,可以说是一个意思的。
这里给不懂的简单的解释一下。
interface/protocol就是一种标准,其他的类可以继承(extend)interface,继承之后要求必须Override其中的所有"抽象方法"。
用最大的大白话来讲,就是"契约/协议",就好像劳动合同一样,只要你签订了之后,你就必须要干合同里约定的活。
AHK的底层"劳动合同"就是三个
分别是
- Get(获取) 一个值.
- Set(设置) 一个值, 使用
:=
.- Call(调用) 一个方法, 使用
()
.
也就是说,任何东西都必须实现Get/Set/Call这三种方法。
实际上这三种方法是由AHK自动生成的。 你不去手动定义,他们也是存在的。
元编程,就是直接对这三个底层方法进行改动,对自动生成的过程进行接管。
所以元编程可以说是"脱内裤"。
对象协议的语法糖
之所以要把他们搞得这么"底层",就是因为这些东西太常用了,平常是不需要改的。这也就是"编程语言"的意义,让编程更加的自然语言化,更加的容易读懂。
特殊条件下,我们不满足于他预设的这些"语法糖"。
我们需要深入到内部进行更改,这样的话,我们就要学习运作的一些细节。
Set和Get的语法糖
最常见的就是形式是 myObj[name]
和 myObj.name
示例-AB011-1:get的两种常用语法糖
myObj:=["A","B"]
DeBugDeepPrintln(myObj.1,"myObj.1 >>> ")
DeBugDeepPrintln(myObj[1],"myObj[1] >>> ")
示例-AB011-1:get的两种常用语法糖
第一种形式,是绝大多数编程语言中给"数组"使用的语法糖,第二种形式是"属性(变量)"常用的语法糖。
它们对应元函数是
__Get(aName){}
咦,在SciTE中为什么提示,可以放入很多参数呢?
其实这个__Get是完全可以自定义的,虽然默认生成的都是一个参数,那你完全可以这么搞。
__Get(aName,para*){}
Para*是"可变参数","可变参数"其实是一个数组,它的默认值是‘[]’空数组,所以可以不填。
填入任何其他的元素,都会直接装入这个数组中然后传递给调用者。
在AHK中如果找不到对应的元函数,那么就会返回空字符串,也就是相当于直接写return
。
所以,如果你用get的第三种形式,这么写的话,在默认的任何Object中都不会报错,而是直接返回""。
myObj:=["A","B"]
DeBugDeepPrintln(myObj.1,"myObj.1 >>> ")
DeBugDeepPrintln(myObj[1],"myObj[1] >>> ")
DeBugDeepPrintln(myObj[1,2],"myObj[1,2] >>> ")
get的第三种形式
那下面我们就通过元编程,让myObject[1,2]可以正常被调用。
__Get()实操
之前我们创立对象的时候用的是myObj:=["A","B"]
,其实这就是AHK自动生成的对象,所以它是不受我们控制的,这种方法其实可以看成myObj:=Array("A","B")
的语法糖。
既然我们要深入细节进行改动,那么就不能让它自动生成了。所以我们需要用到Class。
MateObj:=new Mate()
DeBugDeepPrintln(MateObj[1,2],"MateObj[1,2] >>> ")
Class Mate{
__Get(aName,Para*){
if (aName=1){
return "A"
}
}
}
__Get()实操
好,到这里为止,你就创造了一个"AHK的新语法"。
这算是对AHK元编程的初体验吧,之后会带你看更多有意思的示例。
End
心如止水是Java/AHK持续学习者,欢迎您来和我探讨Java/AHK问题 _
GitHub
欢迎您来访问我的GitHub,在这里您可以看到我的代码分享,关注我的最新动态。
更多文章:
- [专栏] AHK程序设计 - 简书(优先持续更新)
- [基础] [GIF动图] 绕过中文输入法发送文本的3种方法
- [基础] AHK函数对象系列-绑定函数对象v3
- [基础] AHK函数对象系列-绑定方法对象
- [基础] 在AHK中实现函数重载的效果
- [基础] AHK函数对象系列-对象属性与数据域保护v2
问题解答:
[问题解答] 示例不能运行吗? - 关于AHK程序设计系列文章示例问题的解释
版权声明:
该文章版权系“心如止水”所有,欢迎分享、转发,但如需转载,请联系QQ:3404624865,得到许可并标明出处和原链接后方可转载。未经授权,禁止转载。版权所有 ©心如止水 保留一切权利。
文章版本:
v1
网友评论