2012-06-11 9 views
9

मैं एक अलग नामस्थान में गतिशील var को परिभाषित करने का प्रयास कर रहा हूं। लोबोस दस्तावेज कहता है:किसी अन्य नामस्थान में गतिशील var कैसे सेट करें

डिफ़ॉल्ट रूप से सभी माइग्रेशन lobos.migrations नामस्थान में रखे जाते हैं। यह माइग्रेशन कमांड द्वारा स्वचालित रूप से लोड हो जाएगा, इसलिए को स्वयं लोड करने की आवश्यकता नहीं है। इस प्रकार, किसी अन्य नामस्थान का उपयोग करने के लिए आपको को lobos.migration/माइग्रेशन-नेमस्पेस गतिशील चर बदलें।

मैं यह नहीं समझ सकता कि गतिशील चर को मेरे नए नामस्थान से कैसे सेट किया जाए।

मैं के माध्यम से (एनएस `lobos.migration) repl में ऐसा कर सकते हैं, लेकिन अपने ही एनएस

(def ^:dynamic lobos.migration/*migrations-namespace* 'gb.install.migrations) 

पैदावार Can't create defs outside of current ns से इस cmd चल रहा है।

मैं इसे कैसे ठीक कर सकता हूं?

उत्तर

18

क्लोजर वर्र्स में रूट बाइंडिंग हो सकती है जो सभी धागे के लिए दृश्यमान है। इसके अतिरिक्त, डायनामिक वर्र्स में प्रति-थ्रेड बाइंडिंग भी हो सकती हैं, प्रत्येक केवल एक थ्रेड के लिए दिखाई देती है।

आप अस्थायी रूप से binding का उपयोग करके एक प्रति-धागा अपने वर्तमान थ्रेड के लिए बाध्यकारी बना सकते हैं:

(binding [lobos.migration/*migrations-namespace* 'gb.install.migrations] 
    ;; binding is in effect here in the body of the binding form 
) 

या अगर एक प्रति धागा बाध्यकारी प्रभाव में पहले से ही है, तो आप अपने मूल्य set! का उपयोग कर बदल सकते हैं:

(set! lobos.migration/*migrations-namespace* 'gb.install.migrations) 

लेकिन संभव है कि आपको इस विशेष गतिशील var को सभी धागे में दिखाई देने के तरीके में बदलने की आवश्यकता होगी। अगर यह सही है, तो आप कुछ इस तरह करने से उसकी जड़ बंधन को बदलना होगा: और

(alter-var-root #'lobos.migration/*migrations-namespace* 
       (constantly 'gb.install.migrations)) 

नोट मैं नहीं जानता कि Lobos खुद के बारे में कुछ भी तो निश्चय के साथ नहीं कह सकता कि इनमें से किसी भी होगा वास्तव में lobos इच्छाओं के रास्ते में var सेट।

+0

बिग वोट अप, चूसर, लेकिन वाह - वह अंतिम संस्करण अविश्वसनीय रूप से बारोक है, एक ऑपरेशन के लिए जो मुझे लगता है कि नियमित रूप से शायद ही कभी होता है, भले ही अपेक्षाकृत कम हो। वैश्विक पैरामीटर सेटिंग्स का बहुत उपयोग नहीं किया जाना चाहिए, लेकिन उनके पास जगह है। उदाहरण के लिए, 'pprint' की आउटपुट चौड़ाई को बदलने के लिए, मैं 'clojure.pprint/* print-right-margin *' सेट कर सकता हूं, लेकिन ऊपर वर्णित' alter-var-root' विधि एकमात्र विधि है जिसे मैंने प्राप्त किया है काम करने के लिए। – Mars

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