gpt4 book ai didi

arrays - AutoHotkey 是否能够以从零开始的顺序定义数组?

转载 作者:行者123 更新时间:2023-12-02 08:34:54 26 4
gpt4 key购买 nike

我经常因为 AutoHotkey 不是一种从零开始的语言而感到沮丧。当您从其他语言翻译代码,甚至与它们交互(例如通过 COM ScriptControl 在 JScript 中)时,它并不能很好地匹配。 。即使解析 DOM 元素,您也必须考虑它们是从零开始的,似乎大多数语言都采用了从零开始的数组。

现在您可以声明一个数组并通过执行以下操作使其从零开始:

arr := []
arr[0] := 1

上面的方法有效,如果我要求 arr[0] 它会返回 1。但是如果我使用 length() 方法它会返回 0,即使那里有一个值!

如果我们声明然后push():

arr := []
arr.push(3)

它总是从 1 开始存储,我想改变这一点!

这可以做到吗?

最佳答案

因为 AutoHotkey 是一种原型(prototype) OOP 语言(如 JavaScript),您可以覆盖任何函数,甚至是内置函数。下面是重写 Array() 的演示,根据Lexikos这是一个未记录的事实,它覆盖了数组的定义 []。

我不相信这是可能的,因为论坛上有几个线程要求从零开始本地实现,但没有一个提供解决方案。即使演示了 Array() 重写的线程也没有提到这是可能的!

作为奖励,我添加了 split()(基于零的 StrSplit() 函数),以帮助进一步演示此功能的无限可能性。

请注意,我还没有进行单元测试或实现过方法重写,我可能忽略了一些东西,但我觉得这足以进行概念验证。此外,我毫不怀疑这会影响大型数组的性能,特别是因为我在此演示中实现 Length() 的方式。

x := [] ; declare empty array
x.push("Zero Based rocks!") ; push message to the array.
msgbox % x[0]

x := "" ; clear our Object
x := split("AutoHotkey with Zero Based Arrays")
msgbox % x.2 " " x.3 " " x.4 " " x.1 " " x.0

Array(prm*) {
x := {}
loop % prm.length()
x[A_Index -1] := prm[A_Index]
x.base := _Array
return x
}

split(x, dlm:="", opt:="") {
r := []
for k,v in StrSplit(x, dlm, opt)
r.push(v)
return r
}

Class _Array {

; Modified .length() to account for 0 index
length() {
c:=0
for k in this
c++
return c
}

; Modified .push() to start at 0
push(x) {
if (this.0 == "" && this.length() == 0)
return this.0 := x
else
return this[this.MaxIndex()+1] := x
}
}

关于arrays - AutoHotkey 是否能够以从零开始的顺序定义数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38165433/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com