2016-07-02 7 views
2

私は、AutoHotkeyがゼロベースの言語ではないという事実に、しばしば不満を抱いています。他の言語のコードを翻訳したり、JScriptなどの言語とのやり取りをCOM ScriptControlまで実行しても、一致しません。たとえDOM要素を解析するとしても、それらをゼロベースにする必要があります。ほとんどの言語では、ゼロベースの配列が採用されているようです。AutoHotkeyはゼロベースの配列で配列を定義できますか?

今、あなたは、配列を宣言し、それがゼロにこれを行うことにより、ベース作ることができます:私はARRを求めた場合

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

上記の作品は、[0]、それは1を返します。しかし、私は長さを使用している場合()メソッドはそこに値があっても0を返します!

私たちは宣言してから)(押した場合:

arr := [] 
arr.push(3) 

それは常に1から始まる保存されている、私はこれを変更したいです!

これは可能ですか?

答えて

5

AutoHotkeyはプロトタイプのOOP言語(JavaScriptなど)であるため、組み込み関数であってもオーバーライドできます。以下はLexikosによると、配列をそのような[]として定義することを無効にする、文書化されていない事実であるArray()のデモです。

フォーラムにはネイティブで実装されたゼロベースを求めるいくつかのスレッドがありますが、解決策を提示していないスレッドがいくつかあります。 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 
    } 
} 
+0

本当に素敵です!私はA_Indexの動作を変更する魔法の方法があるのだろうかと思っています。 – Forivin

+0

AutoHotkeyソースコードを使いこなすのは簡単ではないと思います。また、このチェックアウトが好きなら、https://gist.github.com/errorseven/660178adcc754fd9a7c1b1ff22852167#file-pythahk-ahk – errorseven

関連する問題