Iteratoren - ArrayIter.au3

    • Offizieller Beitrag

    Wenn man eine Zeit lang in anderen Sprachen programmiert und wieder mit AutoIt skriptet, fällt einem auf, wie nützlich z.B. Iteratoren sind. Leider läßt die AutoIt-Syntax das Definieren von Iteratoren als Parameter nicht direkt zu. Ich habe hier mal Anleihe bei der Programmiersprache nim genommen (oops, das Wortspiel war ungewollt) und dortige Sequence templates (eine Art Makros) für 1D-Array in AutoIt adaptiert.

    Es werden Bedingungen/Operationen an das Array übergeben mit denen über alle Elemente iteriert wird. In den Bedingungen wird "it" als Platzhalter für die Werte, über die iteriert wird, verwendet - s. Bsp.

    EDIT 23.03.2020:

    Wie korrekt angemerkt wurde, gehört Opt('MustDeclareVars', 1) nicht in eine UDF. Passiert bei mir automatisch beim Speichern. Habe das nun korrigiert, ebenso ein paar Schreibfehler in den Funktionsbeschreibungen.

  • Hi BugFix,

    sieht schick aus! Da haben wir ein gutes Beispiel, wo es wirklich Sinn macht, Execute zu verwenden! :thumbup:

    Das Script funktioniert soweit super, mir ist allerdings noch eine Kleinigkeit aufgefallen:

    Du ersetzt in deinen Funktionen per StringReplace einfach "it" durch den entsprechenden Wert. Damit zerschießt du ungewollt Funktionsaufrufe wie diesen hier:

    AutoIt
    _ArrayKeepItIf($aN, 'BitAnd(it, 1) = 0')

    Das "it" in BitAnd wird nämlich ebenfalls ersetzt!

    Meiner Recherche nach dürfte das aber nur eine handvoll Funktionen betreffen, die wirklich Sinn machen, darunter die Bit-Funktionen und StringIsDigit.

    Natürlich gäbe es einen Workaround à la

    AutoIt
    Func BAND($a, $b)
        Return BitAND($a, $b)
    EndFunc
    _ArrayKeepItIf($aN, 'BAND(it, 1) = 0')

    Aber vielleicht fällt dir ja eine andere Lösung ein. ;)

    Das gleiche Problem hätte man logischerweise auch, wenn man eigene Funktionen aufruft, die diese Zeichenfolge enthalten.

    Viele Grüße

    Xenon

  • Echt interessant. Vielen Dank BugFix . Mir ist aufgefallen, dass ArrayIter.au3 mit Opt('MustDeclareVars', 1) beginnt. In ein UDF File gehört das nicht. Wahrscheinlich hast du vergessen, es zu löschen, oder?

    Grüße autoiter

  • Wie korrekt angemerkt wurde, gehört Opt('MustDeclareVars', 1) nicht in eine UDF.

    Was hat es denn damit auf sich? Ist das so, damit es nicht in das Script übertragen wird, das die UDF einbindet?

    BugFix Deine Infos und Code zu Iteratoren sind eine interessante Sache. Danke fürs Teilen! :thumbup:

    Bernd.

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

    • Offizieller Beitrag

    Was hat es denn damit auf sich? Ist das so, damit es nicht in das Script übertragen wird, das die UDF einbindet?

    Ja, wenn das eingebundene Skript die Option enthält und das aufrufende Skript anschließend keine anders lautende Option setzt, gilt das für das gesamte Skript. Eine UDF hat jedoch nicht in die Gestaltung des Main-Skripts einzugreifen.