文章目录
- **初步认识**
- 类和继承
- 枚举属性和For循环
- 数组和映射
初步认识
在AHK
中,对象就是一种内部封装了属性和方法的变量,而和常见的面向对象编程语言不同的是,这里面的属性和方法是可以动态添加的。下面举一个最简单的例子
person := {} ; 创建对象.
; 下面添加两条对象属性
person.name := "micro"
person.age := 18
; 添加自我介绍的方法
person.say := say
say(this){
MsgBox "我是" this.name ",今年" this.age "岁"
}
Capslock::person.say()
效果如下
类和继承
AHK
也支持通过类的实例化来创建对象的方法,并且支持对class
的继承,下面仍以person
举例,做一个class
; AHK不分大小写,这里只是习惯大写开头
class Person{
__New(name, age){
this.name := name
this.age := age
}
say(){
MsgBox "我是" this.name ",今年" this.age "岁"
}
}
Capslock::{
p := Person("micro", 18)
p.say()
}
其中,__New
函数为Person
类的构造函数,在调用Person
创建对象时,就会自动执行__New
函数中的内容。
通过关键字extends
可以实现对类的继承,比如在Person
类的基础上创建一个Student
类
class Student extends Person{
No := 0
}
; 更改大写锁定键的映射
Capslock::{
p := Person("micro", 18)
p.no := 2
MsgBox p.no
}
枚举属性和For循环
之前在介绍循环时,留下了For
循环这个尾巴,这是因为并非所有对象都适用于For
循环,除非类中声明了__Enum
属性,下面以学生类举例,来详细解释一下For
循环的用法
class Student extends Person{
Grade := [80, 90, 95, 98, 100]
__Enum(num){
local i := 1
f(&k){
if(i>5){
return false
}else{
k := this.Grade[i]
i += 1
return true
}
}
return f
}
}
Capslock::{
p := Student("micro", 18)
for g in p{
MsgBox g
}
}
然后,再重新载入脚本,并按下大写锁定键,就会出现下面这样的效果
其中,Grade
是一个数组,可采取方括号的创建方式,并且通过方括号和数字进行索引。
__Enum
即为For..in
循环中调用的函数,其输入参数num
表示for..in
中间迭代参数的个数。
数组和映射
数组和映射是AHK
内置的两种对象,也相当于是两种数据结构,这两种对象中均封装了__Enum
函数,从而支持For
循环。而且支持两种for
循环调用方式,假设lst
是一个数组,这两种方式如下
lst = ["a", "b", "c"]
for L in lst{
MsgBox L
}
for i,L in lst{
MsgBox i ":" L
}
前者迭代的是lst
中的值,即a,b,c
;后者则迭代lst
中的序号和值,其输出依次为1:a
;2:b
;3:c
。
作为一种对象,数组除了可以通过方括号初始化之外,还可以调用Array
函数,
lst = Array(1,2,3,4,5)
此外,还封装了一些便捷的函数,包括插入元素InsertAt
;追加内容Push
;移除元素RemoveAt
;移除最后一项Pop
,以lst
为例
lst.InsertAt(3, "c", "d") ;在位置3处插入c,d
lst.push("e","f") ;在数组结尾添加e, f
映射在AHK中的另一个名字是关系数组,可以理解为索引不为正整数的数组,或者理解为键值对数组,其创建方式如下
Map("ten", 10, "twenty", 20, "thirty", 30)
; 对应关系为 ten => 10; twenty => 20; thirty => 30
Map
也支持For
循环,示例如下
For key, value in MyMap
MsgBox key ' = ' value