用于连续对象语法访问中(如,A.B.D.E:=1),判断当前节点(A.B.D)是否为对象。
旧方法IsObject:
Code: Select all
if isObject(A) && isObject(A.B) && isObject(A.B[C]) && isObject(A.B[C].D)
A.B[C].D.E:=1
-
方式一:IsObjects:
清晰,符合习惯,可替代IsObject函数。
Code: Select all
if isObjects(A,"B",C,"D") A.B[C].D.E:=1
原理:
构造过程(函数),内部自动逐层判断。
代码:
AHK V2:(V1可能需要小改动)Code: Select all
isObjects(_o*){ local _c:=ObjMaxIndex(_o) _c:=_c?_c:0 local _t:=ObjRemove(_o,1) Loop _c{ if not IsObject(_t) return false _t:=_t[_o[A_Index]] } return _c?true:false } ;测试: a:={b:{c:{},d:"none-object"},e:"none-object"} MsgBox % IsObjects(a,"b","c") "," IsObjects(a,"b","d") "," IsObjects(a,"e") "," IsObjects("none-object","e")
- 方式二:ObjectOrNull
对象语法,也还顺畅。
Code: Select all
if ObjectOrNull(A).B[C].D!=Null A.B[C].D.E:=1
但注意,不可判断ObjectOrNull(A).B.D.E!=Null,它无意义,因为目的是判断E前面的部分是否是有效的对象。
原理:(通过类)构造代理(对象),实现返回经代理包装的对象,且对象当键的值非对象时,返回定义的特殊对象Null,对Null的访问一律返回Null对象。
代码:
AHK V2:(V1可能需要小改动)Code: Select all
global Null:={base:_ObjectOrNull} ;超级全局变量,避免每次声明Null Null[Null]:=Null class _ObjectOrNull{ __New(_o){ if (_o=Null || (not IsObject(_o))) ;not IsObject(_o)包含_o为空的情况。 return Null this[this]:=_o } __Get(_p){ if this[this]=Null return Null local _t:=new _ObjectOrNull(this[this][_p]) return _t } } ObjectOrNull(_o){ return new _ObjectOrNull(_o) } ;测试: a:={b:{c:{c:"c"},d:"none-object"},e:"none-object"} MsgBox % ((ObjectNull(a).b.c=Null)?0:1) "," ((ObjectNull(a).b.c.D=Null)?0:1) "," ((ObjectNull(a).b.d=Null)?0:1) "," ((ObjectNull(a).e=Null)?0:1) "," ((ObjectNull(a).f.g=Null)?0:1) ;1,0,0,0,0