Ich habe mir mal ein kleines Bsp.-Skript für Maps erstellt. Im letzten Schritt wollte ich testen, welche Datentypen sich als Schlüssel verwenden lassen.
Lasst es einfach mal durchlaufen und im zweiten Schritt aktiviert die MapExist-Prüfung in der Funktion _KeyAssignCheck (Kommentare freigeben).
Ohne Prüfung wird alles als erfolgreich angegeben, mit Prüfung werden einige Datentypen aber als existierende Schlüssel betrachtet, ich hätte eigentlich erwartet, dass Objekte oder Strukturen beim Hinzufügen als Key einen Fehler auswerfen.
Dass Bool und Keyword mit den AutoItersetzungen (Bool=0/1; Keyword=0) interpretiert werden und somit als Integer-Key Verwendung finden war erwartbar. Aber was für Werte sind dann Strukturen, Arrays oder Objekte? Eine Art UNKNOWN_KEY, der dann für alle gleichermaßen Verwendung findet?
Ist sicher etwas abstrakt - aber es interessiert mich halt, was machbar ist.
;-- TIME_STAMP 2022-12-01 11:36:41
; DEKLARATION
; wie ein Array nur ohne Elementzahl und ohne Wertzuweisung
Global $gmMap[]
; WERTE HINZUFÜGEN
; 1. mit benanntem Schlüssel
$gmMap['mein Key#1'] = 'mein Wert #1'
$gmMap['mein Key#2'] = 'mein Wert #2'
; 2. mit Funktion
; Schlüssel ist der nächste freie Integerwert bei '0' beginnend, wird von der Funktion zurückgegeben
Global $keyReturn = MapAppend($gmMap, 'mein Wert #3')
$keyReturn = MapAppend($gmMap, 'mein Wert #4')
; AUSGABE INHALT
; 1. für einen benannten Schlüssel
ConsoleWrite(StringFormat('KEY: %-10s, VALUE: %s', $keyReturn, $gmMap[$keyReturn]) & @CRLF & @CRLF)
; 2. für alle Schlüssel mit Iteratorfunktion
For $key In MapKeys($gmMap)
ConsoleWrite(StringFormat('KEY: %-10s, VALUE: %s', $key, $gmMap[$key]) & @CRLF)
Next
ConsoleWrite(@CRLF)
; PRÜFEN OB KEY EXISTIERT
ConsoleWrite('MapExists "mein Key#2": ' & (MapExists($gmMap, 'mein Key#2') = 1) & @CRLF & @CRLF)
; INHALT EINES SCHLÜSSELS LÖSCHEN - ABER NICHT DEN SCHLÜSSEL
$gmMap['mein Key#2'] = Null ; ein Map-Schlüssel ist leer, wenn der Wert "Null" ist
ConsoleWrite(StringFormat('"mein Key#2" existiert: %s, VALUE: %s', (MapExists($gmMap, 'mein Key#2') = 1), ($gmMap['mein Key#2'] = Null ? 'Null' : '')) & @CRLF & @CRLF)
; SCHLÜSSEL LÖSCHEN
MapRemove($gmMap, 'mein Key#2')
ConsoleWrite(StringFormat('"mein Key#2" existiert: %s', (MapExists($gmMap, 'mein Key#2') = 1)) & @CRLF & @CRLF)
; WELCHE DATEN KÖNNEN SCHLÜSSEL SEIN?
Func _KeyAssignCheck($_vKey, $_vValue)
Local $sType = VarGetType($_vKey), $sResult = 'SUCCESS'
;~ If Not MapExists($gmMap, $_vKey) Then
$gmMap[$_vKey] = $_vValue
If $gmMap[$_vKey] <> $_vValue Then $sResult = 'FAILURE'
;~ Else
;~ $sResult = 'THE KEY ALREADY EXISTS. [' & $_vKey & ']'
;~ EndIf
Return StringFormat('[%-20s - %s', $sType & ']', $sResult)
EndFunc
ConsoleWrite(_KeyAssignCheck(12345, '$i') & @CRLF)
ConsoleWrite(_KeyAssignCheck('abcd', '$s') & @CRLF)
ConsoleWrite(_KeyAssignCheck(123.456, '$f') & @CRLF)
ConsoleWrite(_KeyAssignCheck(Binary('abc'), '$bin') & @CRLF)
ConsoleWrite(_KeyAssignCheck(DllStructCreate('byte[4]'), '$t') & @CRLF)
ConsoleWrite(_KeyAssignCheck(DllStructGetPtr(DllStructCreate('byte[4]')), '$ptr') & @CRLF)
Global $ar[2] = [22,33]
ConsoleWrite(_KeyAssignCheck($ar, '$ar') & @CRLF)
ConsoleWrite(_KeyAssignCheck(True, '$b') & @CRLF)
ConsoleWrite(_KeyAssignCheck(ObjCreate('Scripting.Dictionary'), '$o') & @CRLF)
ConsoleWrite(_KeyAssignCheck(Default, '$keyWord') & @CRLF)
Alles anzeigen
Prüfergebnis ohne MapExists
[Int32] - SUCCESS
[String] - SUCCESS
[Double] - SUCCESS
[Binary] - SUCCESS
[DLLStruct] - SUCCESS
[Ptr] - SUCCESS
[Array] - SUCCESS
[Bool] - SUCCESS
[Object] - SUCCESS
[Keyword] - SUCCESS
Alles anzeigen
Prüfergebnis mit MapExists
[Int32] - SUCCESS
[String] - SUCCESS
[Double] - SUCCESS
[Binary] - SUCCESS
[DLLStruct] - THE KEY ALREADY EXISTS. []
[Ptr] - SUCCESS
[Array] - THE KEY ALREADY EXISTS. []
[Bool] - THE KEY ALREADY EXISTS. [True]
[Object] - THE KEY ALREADY EXISTS. []
[Keyword] - THE KEY ALREADY EXISTS. [Default]
Alles anzeigen