2012-05-07 6 views
7

Cosa sto facendo male? Dai miei test, objDic.exists NON DÀ MAI False!Il dizionario VBScript esiste Il metodo restituisce sempre True

dim objDic 

    set objDic = createobject("scripting.dictionary") 

    objDic.add "test","I have not been deleted" 

    wscript.echo objDic.item("test") 'Displays -- I have not been deleted 

    objDic.remove "test" 

    wscript.echo """" & objDic.item("test") & """" 'Displays -- "" 

    if objDic.exists("test") then wscript.echo """" & objDic.item("test") & """" 'Displays -- "" 

risposta

12

Vicino come posso dire, un dizionario chiave oggetto viene creato semplicemente riferimento a esso come se esiste.

wscript.echo objDic.Item("test") 'Creates the key whether it exists or not 
wscript.echo objDic.Exists("test") 'Will now return true 

Ecco un altro codice per provare/testare la mia teoria. Di solito uso MsgBox invece di WScript.Echo, come vedrai nel mio codice.

dim objDic, brk 
brk = vbcrlf & vbcrlf 
set objDic = createobject("scripting.dictionary") 
objDic.add "test","I have not been deleted" 
wscript.echo "objDic.Exists(""test""): " & brk & objDic.item("test") 
WScript.Echo "Now going to Remove the key named: test" 
objDic.remove "test" 
MsgBox "objDic.Exists(""test""): " & brk & objDic.Exists("test") 'Returns False 
wscript.echo "objDic.item(""test""): " & brk & objDic.item("test") 'Shows Blank, Creates the key again with a blank value 
wscript.echo "objDic.item(""NeverAdded""): " & brk & objDic.item("NeverAdded") 'Also shows blank, does not return an error 
MsgBox "objDic.Exists(""test""): " & brk & objDic.Exists("test") 'Returns True 
+2

Assolutamente corretto. Ecco la [documentazione ufficiale] (http://msdn.microsoft.com/en-us/library/84k9x471%28VS.84%29.aspx), che menziona, "Se * chiave * non viene trovata quando si tenta di restituire un elemento esistente, viene creata una nuova * chiave * e l'elemento corrispondente viene lasciato vuoto. " –

+1

Promosso dalla nuova risposta, nel rivisitare questa domanda, sono altrettanto confuso su come la creazione di una chiave, se non esiste, è utile, come lo sono stato quando ho guardato l'ultima volta questa domanda. Qualcuno può spiegare le ragioni dietro a questo? Posso solo supporre che questo sia radicato in comp. sci. teorie sugli oggetti del dizionario ?? – user66001

+1

@ user66001 Come programmatore pragmatico, mi preoccupo meno del perché qualcosa del genere sia progettato così com'è e si preoccupi di più di ricordare questi tipi di stranezze. – HK1

-2

La risposta accettata non ha risposto alla mia domanda. Immagino anche gli altri, quindi sto postando la mia soluzione poiché questo thread è il primo risultato su google.

La chiave verrà creata di default se non esiste. I dizionari sono pensati per aggiungere voci se non esistono, quindi il sotto restituirà sempre true.

If objDic.exists("test") then 

Poiché la chiave viene creata quando si verifica la sua esistenza, il valore non è stato definito. Di seguito verrà verificato se alla chiave non è associato un valore. Naturalmente questo non funzionerà con il tuo dizionario se hai valori vuoti.

If objDic.item("test") <> "" then 
+3

questo è sbagliato. Un tentativo di leggere/accedere a una chiave inesistente creerà un valore vuoto (auto-vivificazione), ma. Esiste ("nix") restituirà falso, se il dizionario non contiene "nix".vedere: http://stackoverflow.com/questions/6910996/scripting-dictionary-lookup-add-if-not-present-with-only-one-key-search –

+1

Sfortunatamente @Jon non riesco a replicare i risultati su XP o Win 7 [nei miei test] (http://i.imgur.com/6FqAq.png) – user66001

0

Elimina tutte le variabili guardato dalla IDE che hanno a che fare con il dizionario. È ripetibile. È possibile causare/correggere il comportamento in questo modo (IDE VBA di Outlook 2010). Un po 'come l'effetto dell'osservatore, immagino. . .

-M

1

avuto lo stesso problema qui ...
Nel mio codice, c'è una matrice dinamica di dizionari.
Alcune voci hanno la chiave "ALTA", altre no.
Test per la presenza della chiave per ogni voce sempre restituito true:

for each dictionary_entry in dictionary_array 
     if dictionary_entry.Exists("HIGH") then msgbox("Hey, I have a HIGH key, and its value is " + dictionary_entry("HIGH)) 
next 

Il debugger ha creato un tasto "HIGH" per ogni dictionary_entry se ho guardato la variabile.
È stato necessario eliminare entrambi dizionario_entry e array_commerciale dalle variabili guardate per far funzionare correttamente il codice.