「河许人」AutohotkeyAHK程序设计AutoHotkey 之美

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

2019-01-02  本文已影响4人  d61f25068828

_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程序设计系列文章示例问题的解释

版权声明:

该文章版权系“心如止水”所有,欢迎分享、转发,但如需转载,请联系QQ:3404624865,得到许可并标明出处和原链接后方可转载。未经授权,禁止转载。版权所有 ©心如止水 保留一切权利。

文章版本:

v1

AHK版本:1.1.30.00

心如止水
上一篇 下一篇

猜你喜欢

热点阅读