2009-12-29 17 views
5

मैं जानना चाहता हूं कि मैं खाली कैसे परिभाषित करूं! OCaml में Hashtbl प्रकार के वैश्विक चर? मैं हैशब्लॉक.क्रेट का उपयोग नहीं करना चाहता क्योंकि मुझे इसका प्रारंभिक आकार नहीं पता है और मैं प्रदर्शन कारणों के लिए प्रारंभिक आकार का अनुमान नहीं लेना चाहता हूं।ओकैमल खाली वैश्विक चर

असल में इस हैशब्लबल वैरिएबल को एक फ़ंक्शन में एक वास्तविक हैशब्लबल का आकलन किया जाएगा और फिर यह चर अन्य कार्यों के बीच साझा किया जाएगा, इसलिए मैं इसे हर समय एक तर्क के रूप में पास नहीं करना चाहता हूं इसलिए मैं इसे पसंद करूंगा वैश्विक बनो

धन्यवाद,

Spasski

उत्तर

5

क्या आप के लिए पूछ संभव है। आप एक वैश्विक संदर्भ को परिभाषित कर सकते हैं (इससे आप इसे बाद में असाइन कर सकते हैं) हैश टेबल विकल्प पर (इससे आपको पहले इसे अनियंत्रित छोड़ दिया जा सकता है)। परिभाषा इस तरह दिखेगा:

let hashtable = ref None 

प्रारंभ हो जाएगा:

hashtable := Some (Hashtbl.create n) 

इसका इस्तेमाल करने के लिए आपको भी व्याख्या करने के लिए यदि आप इसे अभी तक प्रारंभ नहीं किया गया है कि क्या होने चाहिए होगा:

match !hashtable with 
    | None -> assert false 
    | Some h -> frobnicate h 

अभ्यास में, अनियमित चर ओकैमल दर्शन के खिलाफ हैं और केवल आपके जीवन को कठिन बना देंगे। मैं दृढ़ता से सलाह देता हूं कि आप इस दृष्टिकोण का उपयोग न करें। मेरे दो सुझाव होंगे:

  • एक अनुमानित आकार के साथ हैश तालिका बनाकर प्रदर्शन हानि का निर्धारण करें। ओवरहेड आपके विचार से बहुत छोटा हो सकता है।

  • बस हर जगह हैश तालिका पास करें। यह एक एकल तर्क है, जो एक विकल्प संदर्भ से छोटा है ...

  • अपनी हैश तालिका और कक्षाओं में इसका उपयोग करके कार्य करें। OCaml में

6

hashtables रूप में की जरूरत हो जाना है, तो आप सिर्फ पहली बार में एजी सर्वोत्तम अनुमान दे सकते हैं, उदाहरण के लिए:

module A 

let hash = Hashtbl.create 123;; 

... 

let exceed_hash() = 
     for i = 1 to 555 do 
       Hashtbl.add hash i (string_of_int i) 
     done;; 

यद्यपि आप प्रारंभिक संख्या से अधिक है, लेकिन यह आसानी से भी काम करेगा, इस जाँच अधिक जानकारी के लिए ट्यूटोरियल http://www.ocaml-tutorial.org/hashtbl

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