美文网首页「河许人」AutohotkeyAHK程序设计AutoHotkey 之美
[中级] AHK元编程初步:对象协议和__Get()

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

作者: d61f25068828 | 来源:发表于2019-01-02 20:47 被阅读4次

    _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

    心如止水

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/nlptrqtx.html