2012-05-07 12 views
7

मैं क्या गलत कर रहा हूं? मेरे परीक्षणों से, objDic.exists कभी झूठा नहीं देता है!वीबीस्क्रिप्ट शब्दकोश मौजूद है विधि हमेशा सही होती है

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) है, जो उल्लेख करता है, "अगर * कुंजी * वापस करने का प्रयास करते समय नहीं मिला मौजूदा आइटम, एक नया * कुंजी * बनाया गया है और इसकी संबंधित वस्तु खाली छोड़ दी गई है। " –

+1

इस सवाल की समीक्षा में नए जवाब से संकेत मिलता है, मैं इस तरह की उलझन में हूं कि एक कुंजी का निर्माण कैसे अस्तित्व में नहीं है, यह सहायक है, क्योंकि जब मैंने पिछली बार इस प्रश्न को देखा था। क्या कोई इसके पीछे कारण बता सकता है? मैं केवल यह मान सकता हूं कि यह COMP में निहित है। विज्ञान। शब्दकोश वस्तुओं के बारे में सिद्धांत ?? – user66001

+1

@ user66001 एक व्यावहारिक प्रोग्रामर के रूप में, मुझे इस बारे में कम चिंता है कि ऐसा कुछ क्यों बनाया गया है और इस तरह के क्विर्क को याद रखने के बारे में और चिंता करें। – HK1

-2

स्वीकृत उत्तर ने मेरे प्रश्न का उत्तर नहीं दिया। मैं दूसरों को या तो कल्पना करता हूं इसलिए मैं अपना समाधान पोस्ट कर रहा हूं क्योंकि यह धागा Google में पहला परिणाम है।

कुंजी डिफ़ॉल्ट रूप से बनाई जाएगी यदि यह मौजूद नहीं है। शब्दकोश प्रविष्टियों को जोड़ने के लिए हैं यदि वे मौजूद नहीं हैं, इसलिए नीचे हमेशा सत्य वापस आ जाएगा।

If objDic.exists("test") then 

चूंकि जब आप इसके अस्तित्व की जांच करते हैं तो कुंजी बनाई जाती है, इसलिए मूल्य परिभाषित नहीं किया गया है। नीचे जांच होगी कि कुंजी के साथ कोई मूल्य नहीं है या नहीं। बेशक यह आपके शब्दकोश के साथ काम नहीं करेगा यदि आपके पास खाली मूल्य हैं।

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

यह गलत है। गैर-मौजूद कुंजी को पढ़ने/एक्सेस करने का प्रयास एक खाली मान (ऑटो-विविफिकेशन) बनाएगा, लेकिन यदि शब्दकोश में "निक्स" नहीं है, तो .xists ("nix") झूठी वापसी करेगा।देखें: 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

आईडीई से सभी देखे गए चर हटाएं जिनके पास आपके शब्दकोश के साथ कुछ भी करना है। यह दोहराने योग्य है। आप व्यवहार को इस तरह से कर सकते हैं/ठीक कर सकते हैं (आउटलुक 2010 वीबीए आईडीई)। मुझे लगता है कि पर्यवेक्षक प्रभाव की तरह सॉर्ट करें। । ।

-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_entry और dictionary_array को हटाए गए चर से हटा देना था।

संबंधित मुद्दे