使Array数组对象以0为第一个元素, ComObjArray以1为第一个元素

在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

给TA捐赠
共{{data.count}}人
人已捐赠
教程

2.1第一个Autohotkey程序-热键打开中文社区网站

2020-11-22 16:01:36

教程

正则替换Ex、正则全局匹配模式

2020-11-24 13:19:31

5 条回复 A文章作者 M管理员
  1. Ash

    请问v1也可以这样改吗?

    • thqby

      不行

    • Ash

      请问v1里怎么能创建出下标为1的ComObjArray呢?(ComObjArray默认的下标为0)

    • 火冷

      应该也不行,都是规定死的。

  2. Wilson

    a[0]:=”a”
    直接用0下标赋值即可

个人中心
购物车
优惠劵
有新私信 私信列表
搜索