在AutoHotkey中,数组对象Array是以1为第一个元素的,而在其他一些语言(如c++、JavaScript等)中是以0为第一个元素的,一些同时使用其他语言的ahker会感到不习惯,可以通过修改Array类的__Item属性和__Enum方法来改变这一行为。在脚本的自动执行段添加以下几行即可实现这一需求
/************************************************************************
* @file: array_zero_based_index.ah2
* @description: 使Array数组对象以0为第一个元素
* @author thqby
* @date 11/23/2020
* @version 1.0
***********************************************************************/
changeArrayIndexToZeroBased() {
static init := (() => (
__enum := Array.Prototype.GetOwnPropDesc("__Enum").call,
__item := Array.Prototype.GetOwnPropDesc("__Item"),
__set := __item.set, __get := __item.get,
Array.Prototype.DefineProp("__Item", {
get: (s, i) => __get(s, i + 1),
set: (s, v, i) => __set(s, v, i + 1)
}),
Array.Prototype.DefineProp("__Enum", { call:
(s, n := 1) => (n != 2 ? __enum(s, n) :
(n := s.Length, i := 0, (&k, &v) => (
i < n ? (k := i++, v := __get(s, i), true) : false
))
) })
))()
}
changeComArrayIndexToOneBased() {
static init := (() => (
__enum := (Object.GetOwnPropDesc)(ComObjArray.Prototype, "__Enum").call,
__item := (Object.GetOwnPropDesc)(ComObjArray.Prototype, "__Item"),
__set := __item.set, __get := __item.get,
(Object.DefineProp)(ComObjArray.Prototype, "__Item", {
get: (s, i) => __get(s, i - 1),
set: (s, v, i) => __set(s, v, i - 1)
}),
(Object.DefineProp)(ComObjArray.Prototype, "__Enum", { call:
(s, n := 1) => (n != 2 ? __enum(s, n) :
(n := s.MaxIndex(), i := 0, (&k, &v) => (
i <= n ? (v := __get(s, i), k := ++i, true) : false
))
) })
))()
}
示例:
changeArrayIndexToZeroBased()
arr:=[4,56,3,2,65]
msgbox arr[0] ; 4
arr[0]:=89 ; [89,56,3,2,65]
for i, v in arr
msgbox i ' ' v
; 0 89
; 1 56
; 2 3
; 3 2
; 4 65
changeComArrayIndexToOneBased()
aa := ComObjArray(3, 5)
aa[1] := 534, aa[2] := 9548, aa[4] := 9342
for k, v in aa
MsgBox k ' ' v
for v in aa
MsgBox v
请问v1也可以这样改吗?
不行
请问v1里怎么能创建出下标为1的ComObjArray呢?(ComObjArray默认的下标为0)
应该也不行,都是规定死的。
a[0]:=”a”
直接用0下标赋值即可