2012-05-07 37 views
7

我在做什麼錯了?從我的測試中,objDic.exists從不給出False!VBScript字典存在方法總是返回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 -- "" 

回答

12

據我所知,字典對象密鑰是通過僅僅引用它來創建的,就像它存在一樣。

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

下面是一些可以嘗試證明/測試我的理論的代碼。我通常使用MsgBox而不是WScript.Echo,就像你在代碼中看到的那樣。

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

絕對正確。這是[官方文檔](http://msdn.microsoft.com/en-us/library/84k9x471%28VS.84%29.aspx),其中提到,「如果* key *在嘗試返回時未找到現有項目,將創建一個新的*鍵*並將其相應項目留空。「 –

+1

在新的答案的提示下,在重新回顧這個問題時,我對如何創建一個不存在的密鑰是有幫助的,就像我上次看這個問題時一樣困惑。任何人都可以解釋背後的原因?我只能假設這是根植於comp。 SCI。有關字典對象的理論? – user66001

+1

@ user66001作爲一個實用的程序員,我不太擔心爲什麼像這樣設計它的方式,並且更多地擔心記住這些怪癖。 – HK1

-2

接受的答案沒有回答我的問題。我想象別人,所以我發佈我的解決方案,因爲這個線程是谷歌的第一個結果。

如果密鑰不存在,將默認創建密鑰。字典是爲了添加條目,如果它們不存在,因此下面將始終返回true。

If objDic.exists("test") then 

由於密鑰是在您測試存在時創建的,因此該值尚未定義。下面將測試密鑰是否沒有與之相關的值。當然,如果你有空白的值,這將不適用於你的字典。

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

這是錯誤的。嘗試讀取/訪問不存在的鍵會創建一個空值(自動生成),但如果詞典不包含「nix」,則.Exists(「nix」)將返回false。請參閱:http://stackoverflow.com/questions/6910996/scripting-dictionary-lookup-add-if-not-present-with-only-one-key-search –

+1

不幸@Jon我不能在XP或Win上覆制你的結果7 [在我的測試中](http://i.imgur.com/6FqAq.png) – user66001

0

刪除IDE中與您的字典有關的所有觀察變量。它是可重複的。您可以通過這種方式來導致/修復此行爲(Outlook 2010 VBA IDE)。有點像我猜想的觀察者效應。 。 。

-M

1

這裏有同樣的問題...
在我的代碼,有字典的動態數組。
有些條目的關鍵字是「高」,有些則沒有。
測試爲重點的存在總是返回真正的每個條目:

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 

調試創造了每dictionary_entry「高」的關鍵,如果我看了變量。
必須從受監視的變量中刪除dictionary_entrydictionary_array以使代碼正常工作。