2012-05-07 20 views
7

¿Qué estoy haciendo mal? De mis pruebas, objDic.exists NUNCA da False!VBScript Dictionary Existe método Siempre devuelve verdadero

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 -- "" 

Respuesta

12

Por lo que puedo decir, una Clave de objeto de diccionario se crea simplemente haciendo referencia a ella como si existiera.

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

Aquí hay algo más de código se puede tratar de probar/prueba mi teoría. Normalmente uso MsgBox en lugar de WScript.Echo, como verá en mi código.

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

Absolutamente correcto. Aquí está la [documentación oficial] (http://msdn.microsoft.com/en-us/library/84k9x471%28VS.84%29.aspx), que menciona, "Si la * clave * no se encuentra al intentar devolver un elemento existente, se crea una nueva * clave * y su elemento correspondiente se deja vacío. " –

+1

Impulsado por la nueva respuesta, al volver a consultar esta pregunta, estoy tan confundido como la creación de una clave, si no existe, es útil, como lo fue la última vez que vi esta pregunta. ¿Alguien puede explicar las razones detrás de esto? Solo puedo suponer que esto está enraizado en comp. sci. teorías sobre objetos de diccionario? – user66001

+1

@ user66001 Como programador pragmático, me preocupa menos sobre por qué algo así se diseña de la manera que es y me preocupo más por recordar este tipo de caprichos. – HK1

-2

La respuesta aceptada no respondió mi pregunta. Me imagino otros, así que estoy publicando mi solución ya que este hilo es el primer resultado en google.

La clave se creará de manera predeterminada si no existe. Los diccionarios están destinados a agregar entradas si no existen, por lo tanto, a continuación siempre se devolverá verdadero.

If objDic.exists("test") then 

Dado que la clave se crea cuando se prueba su existencia, el valor no se ha definido. A continuación se probará si la clave no tiene un valor asociado. Por supuesto, esto no funcionará con su diccionario si tiene valores en blanco.

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

esto está mal. Un intento de leer/acceder a una clave inexistente creará un valor vacío (auto-vivificación), pero .Exists ("nix") devolverá falso, si el diccionario no contiene "nix".ver: http://stackoverflow.com/questions/6910996/scripting-dictionary-lookup-add-if-not-present-with-only-one-key-search –

+1

Desafortunadamente @Jon no puedo replicar tus resultados en XP o Win 7 [en mis pruebas] (http://i.imgur.com/6FqAq.png) tampoco – user66001

0

Borre todas las variables observadas del IDE que tengan algo que ver con su diccionario. Es repetible Puede causar/corregir el comportamiento de esta manera (Outlook 2010 VBA IDE). Algo así como el efecto del observador, supongo. . .

-M

1

tenía el mismo problema aquí ...
En mi código, hay una matriz dinámica de los diccionarios.
Algunas de las entradas tienen la clave "HIGH", otras no.
pruebas para detectar la presencia de la llave para cada entrada devuelta siempre cierto:

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 

El depurador crea una clave de "ALTO" para cada dictionary_entry si vi la variable.
Tuve que eliminar diccionario_entrada y dictionary_array de las variables observadas para que el código funcione correctamente.

Cuestiones relacionadas