AutoHotKey对象就是AutoHotKey的老婆!哈哈,非常无厘头,但这就是事实。搞定AutoHotKey对象你就基本搞定了AutoHotKey。但是她也不是那么容易搞定的!!
在搞定她之前呢,我们先了解一下什么是对象!?
对象又叫数据对象,是学习编程过程中必须理解的复合信息(类)的抽象。所谓复合信息(类)是指具有一系列不同性质或属性的事物,这相对于之前谈到的变量、数组就相当于广义相对论相对于狭义相对论,哈哈,这个比喻估计能把很多人都整懵了,通俗地讲,对象就是一个广义的数组,数组中可以包含许许多多的数据结构,一个朋友给我举了一个特别形象的比喻,假如人是一个类,“河许人”和“悠然生活_自由”就是人类的两个实例对象,哈哈,河许人就是我,对象就是可以视为个体的存在,有相关的特征和行为。
今天,我们就来说说AutoHotKey的对象!
对象的创建和释放:
<pre>obj := {} ; 创建对象。
obj := "" ; 释放最后一个引用,因此释放对象。</pre>
脚本不会显式的释放对象。
- 当对象的最后一个引用被释放时,会自动释放这个对象。
- 当某个保存引用的变量被赋为其他值时,会自动释放它原来保存的引用。
- 当另一个对象的某个字段被赋为其他值或从对象中移除时,保存在这个字段中的引用会被释放。
这同样适用于数组,因为它是真正的对象。
<pre>arr := [{}] ; 创建包含对象的数组。
arr[1] := {} ; 再创建一个对象,隐式释放第一个对象。
arr.Remove(1) ; 移除并释放第二个对象。</pre>
特殊情况
包含循环引用的对象无法被自动释放。
例如,如果 x.child
引用 y
且 y.parent
引用了 x
,则清除 x
和 y
是不够的,因为父对象仍然包含到这个子对象的引用,反之亦然。要避免此问题,请首先移除循环引用。
<pre>x := {}, y := {} ; 创建两个对象。
x.child := y, y.parent := x ; 创建循环引用。
y.parent := "" ; 在释放对象前必须移除循环引用。
x := "", y := "" ; 如果没有上一行,则此行无法释放对象。
</pre>
备注
语法
对于所有类型的对象都支持数组语法 (方括号) 和对象语法 (句点)。
同时, 对象引用自身也可以用在表达式中:
- 当对象引用使用
= == != <>
中的一种比较运算符和其他值比较时, 仅在两个值都为指向相同对象的引用时它们才被视为相等的. - 进行逻辑运算时对象总是被视为 true, 例如在
if obj
,!obj
或obj ? x : y
中. - 使用
&
取址运算符可以获取对象的地址. 它从此对象创建时到此对象的最后一个引用被释放期间唯一标识此对象。
如果在不期望对象的地方使用对象, 那么它被视为空字符串. 例如, MsgBox %object%
显示空的 MsgBox 且 object + 1
产生空字符串. 由于这种特性可能会变化, 所以不要依赖它。
当方法调用紧接着赋值运算符, 那么它等同于用参数来设置属性. 例如, 下面的方式是等同的:
<pre>obj.item(x) := y
obj.item[x] := y</pre>
通用支持 x.y += 1
和 --arr[1]
这样的复合赋值.
当 getting 或 setting 属性时参数可以省略. 例如, x[,2]
. 脚本可以利用属性的参数和元函数来定义默认值. 方法名称也可以完全省略, 就像这样 x[](a)
. 脚本可以利用 __Call 元函数的首个参数定义默认值, 因为它并不提供返回值. 注意,这并不同于 x.(a)
, 而相当于 x[""](a)
. 如果在调用 COM 对象时省略了属性或方法的名称, 它的 "默认成员" 将被调用.
键
对于哪种值可以在通过 []
, {}
或 new
运算符创建的对象中作为键使用的一些限制:
- 整数键使用本机有符号整数类型存储.
AutoHotkey 32 位支持使用从 -2147483648 到 2147483647 范围内的整数作为键. AutoHotkey 支持 64 位整数, 但仅 AutoHotkey 64 位版本才支持完整范围的整数在对象中作为键使用. - 由上面这点可知, 整数值的字符串格式不会被保留.
例如,x[0x10]
,x[16]
和x[00016]
都是等同的. 这点同样适用于不含小数点的数值型字符串. - 用引号括起来的原义字符串在 v1.x 中被视为纯非数值型, 所以
x[1]
和x["1"]
是 不 等同的. 同时, 如果原义字符串和另一个值串联在一起 (如同在"0x" x
), 结果被视为纯非数值型. 不过, 这不适用于变量, 所以x[1]
和x[y:="1"]
是等同的. 此问题将在 v2 中解决, 所以脚本应避免使用用引号括起来的原义字符串作为键. - 不支持使用浮点数作为键 - 而是把它们转换成字符串. 在 v1.x 中, 浮点数文字保留它们原始的格式, 而纯浮点数 (例如
0+1.0
或Sqrt(y)
的结果) 被强制转换成当前的浮点格式. 考虑到一致和清晰, 脚本中应避免使用浮点文字作为键. - 字符串键"base" 没有和 Insert一起使用时具有特殊含义
讲到这里呢,今天的课程就结束了,希望我今天的课程能让你懂了什么什么是对象,有哪些特点,关于这些特点,大家一定要熟记了!谢谢大家!!