IsObject() Extension/函数 扩展——支持连续对象访问语法

许多实用脚本和封装函数, 可以让您编写脚本更加便捷高效

Moderators: tmplinshi, arcticir

你使用对象吗?

不懂
1
33%
略懂(知道数组、对象)
0
No votes
深入(知道类、元方法)
2
67%
其他
0
No votes
 
Total votes: 3
User avatar
RobertL
Posts: 546
Joined: 18 Jan 2014, 01:14
Location: China

IsObject() Extension/函数 扩展——支持连续对象访问语法

27 Jun 2014, 09:30

功能
用于连续对象语法访问中(如,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

    Code: Select all

    if isObjects(A,"B",C,"D")
    	A.B[C].D.E:=1
    
    清晰,符合习惯,可替代IsObject函数。

    原理
    构造过程(函数),内部自动逐层判断。

    代码
    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
    
参考:
我为人人,人人为己?

Return to “脚本函数”

Who is online

Users browsing this forum: No registered users and 58 guests