2012-05-07 10 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 

ここでは、私の理論を証明したりテストしたりするためのコードがいくつかあります。私は通常、WScript.Echoの代わりにMsgBoxを使用しています。これは私のコードで分かります。

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

私の質問には答えられませんでした。私はこのスレッドがGoogleの最初の結果であるので、私は私の解決策を投稿しているので、他の人のどちらかを想像します。

キーが存在しない場合、デフォルトで作成されます。ディクショナリは、存在しない場合はエントリを追加するためのもので、以下の場合は常にtrueを返します。

If objDic.exists("test") then 

キーは存在をテストするときに作成されるため、値は定義されていません。以下に、Keyに値が関連付けられていないかどうかをテストします。もちろん空白の値がある場合、これはあなたの辞書では機能しません。

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

残念ながら@ジョン私はXPまたはWinであなたの結果を複製することはできません7 [私のテストで](http://i.imgur.com/6FqAq.png) – user66001

0

IDEから、辞書に関係するすべての監視変数を削除します。繰り返すことができます。このように動作を引き起こす/修正することができます(Outlook 2010 VBA IDE)。私が推測するオブザーバー効果のような並べ替え。 。 。

-M

1

が...ここに私のコードで
を同じ問題を抱えていた、辞書の動的配列があります。
エントリの一部にキー「HIGH」がありますが、一部は表示されません。各エントリのキーの存在のため
テストは常に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 

デバッガは、すべてのdictionary_entryのための「HIGH」キーを作成しました。
dictionary_entrydictionary_arrayの両方を削除して、コードを正常に動作させる必要がありました。

関連する問題