乐趣区

[中级] AHK元编程初步:对象协议和__Get()

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] >>> “)

第一种形式,是绝大多数编程语言中给 ” 数组 ” 使用的语法糖,第二种形式是 ” 属性(变量)” 常用的语法糖。
它们对应元函数是
__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] >>> “)

那下面我们就通过元编程,让 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”
}
}

}

好,到这里为止,你就创造了一个 ”AHK 的新语法 ”。
这算是对 AHK 元编程的初体验吧,之后会带你看更多有意思的示例。
End
心如止水是 Java/AHK 持续学习者,欢迎您来和我探讨 Java/AHK 问题 ^_^
GitHub
欢迎您来访问我的 GitHub,在这里您可以看到我的代码分享,关注我的最新动态。
更多文章:

[专栏] AHK 程序设计 – 简书(优先持续更新)
[基础] [GIF 动图] 绕过中文输入法发送文本的 3 种方法
[基础] AHK 函数对象系列 - 绑定函数对象 v3
[基础] AHK 函数对象系列 - 绑定方法对象
[基础] 在 AHK 中实现函数重载的效果
[基础] AHK 函数对象系列 - 对象属性与数据域保护 v2

问题解答:
[问题解答] 示例不能运行吗? – 关于 AHK 程序设计系列文章示例问题的解释
版权声明:
该文章版权系“心如止水”所有,欢迎分享、转发,但如需转载,请联系 QQ:3404624865,得到许可并标明出处和原链接后方可转载。未经授权,禁止转载。版权所有 ©心如止水 保留一切权利。
文章版本:
v1
AHK 版本:1.1.30.00

退出移动版