2016-07-02 12 views
2

Ich war oft frustriert, dass AutoHotkey keine Null-basierte Sprache ist. Es passt nicht gut, wenn Sie Code aus anderen Sprachen übersetzen oder sogar mit ihnen interagieren, wie in JScript über COM ScriptControl. Selbst beim Parsen von DOM-Elementen müssen Sie berücksichtigen, dass sie nullbasiert sind. Es scheint nur, dass die meisten Sprachen nullbasierte Arrays übernommen haben.Kann AutoHotkey Arrays in einer nullbasierten Reihenfolge definieren?

Jetzt können Sie ein Array deklarieren und machen es Null basiert dies tun:

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

Die oben genannten Arbeiten, wenn ich für arr gefragt [0] es 1 zurückkehren würde Aber wenn ich length() Methode gibt es 0 zurück, obwohl dort ein Wert ist!

Wenn wir erklären, und drücken Sie dann():

arr := [] 
arr.push(3) 

Es ist immer gespeichert ab 1, möchte ich dies geändert!

Ist das möglich?

Antwort

5

Da AutoHotkey eine prototypische OOP-Sprache ist (wie JavaScript), können Sie jede Funktion außer Kraft setzen, auch wenn sie in solchen integriert ist. Unten ist eine Demonstration von überschreibendem Array() gezeigt, das gemäß Lexikos eine nicht dokumentierte Tatsache ist, dass es das Definieren eines Arrays als solches überschreibt [].

Ich glaube nicht, dass es möglich ist, da es mehrere Threads in den Foren gibt, die nach NULL-basierten nativen Implementierungen fragen, aber keine bieten eine Lösung. Selbst der Thread, in dem eine Überschreibung von Array() demonstriert wurde, erwähnte nicht, dass dies möglich wäre!

Als Bonus habe ich split() (nullbasierte StrSplit() - Funktion) hinzugefügt, um die endlosen Möglichkeiten dieser Funktion weiter zu demonstrieren.

Nur um zu beachten, ich habe keine Einheit getestet oder implementiert jemals Methode Override, es ist möglich, dass ich etwas übersehen habe, aber ich fühlte, es war genug für einen Proof of Concept. Außerdem habe ich keine Zweifel, dass dies die Leistung bei großen Arrays beeinträchtigen wird, insbesondere weil ich Length() für diese Demo implementiert habe.

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 
    } 
} 
+0

Wirklich nett! Ich frage mich, ob es eine magische Möglichkeit gibt, auch das Verhalten von A_Index zu ändern. – Forivin

+0

Kurz von Unordnung mit AutoHotkey-Quellcode, glaube ich nicht, gibt es. Auch, wenn Sie dies möchten, gehen Sie folgendermaßen vor: https://gist.github.com/erroroseven/660178adcc754fd9a7c1b1ff22852167#file-pythahk-ahk – errorseven

Verwandte Themen