2016-06-08 31 views
6

मैं एक विशेषता के साथ अमृत में इस मॉड्यूल है बाहर जिम्मेदार बताते हैं। मैं Module.get_attribute/2 विधि का उपयोग कर की कोशिश की है, लेकिन यह इस त्रुटि फेंकता है:पहुँच मॉड्यूल मॉड्यूल

iex(79)> Module.get_attribute(MyAwesomeModule, :awesome_number) 
** (ArgumentError) could not call get_attribute on module MyAwesomeModule because it was already compiled 
    (elixir) lib/module.ex:1101: Module.assert_not_compiled!/2 
    (elixir) lib/module.ex:1016: Module.get_attribute/3 

तो अभी, मैं इसे उपयोग करने के लिए एक विधि में मॉड्यूल विशेषता लपेटकर हूँ, लेकिन यह वास्तव में नहीं है मुझे समझो ,

defmodule MyAwesomeModule do 
    @awesome_number 7 

    def awesome_number, do: @awesome_number 

    # other stuff... 
end 

तो मेरे सवाल है वहाँ एक बेहतर/ऐसा करने का उचित तरीका है: मैं बस विधि का उपयोग करें और सभी को एक साथ विशेषता का उपयोग रोक सकता है?

उत्तर

12

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

मॉड्यूल विशेषता के बिना फ़ंक्शन का उपयोग करने के बजाय मॉड्यूल विशेषता रखने के लिए अभी भी एक अच्छा कारण हो सकता है। ये संदर्भ पर निर्भर करता है। ध्यान रखें कि मॉड्यूल गुणों में संग्रहीत मान संकलन समय पर गणना की जाती है। ऐसा कहा जा रहा है कि या का उपयोग करने के लिए मॉड्यूल विशेषता का उपयोग न करने के विभिन्न कारण हो सकते हैं। आइए निम्नलिखित उदाहरण देखें:

यदि awesome_number को हर बार यादृच्छिक रूप से जेनरेट किया जाना है, तो आपको केवल एक फ़ंक्शन के साथ जाना होगा।

यदि awesome_number की गणना की जानी चाहिए (लंबे समय तक) और इसे इसके मूल्य को बदलने की ज़रूरत नहीं है, तो मॉड्यूल विशेषता + फ़ंक्शन को बेनकाब करने के लिए इसे जाने का तरीका है।

संपादित करें:

वहाँ क्या मैंने पहले कहा है की विशेषताओं मॉड्यूल अधिक है। वे सिर्फ कार्यों से बेहतर प्रदर्शन करते हैं। यहाँ एक उदाहरण और अमृत डॉक्स से एक उद्धरण है:

defmodule MyServer do 
    @my_data 14 
    def first_data, do: @my_data 
    @my_data 13 
    def second_data, do: @my_data 
end 

MyServer.first_data #=> 14 
MyServer.second_data #=> 13 

Notice that reading an attribute inside a function takes a snapshot of its current value. In other words, the value is read at compilation time and not at runtime. As we are going to see, this makes attributes useful to be used as storage during module compilation.

उन्हें का उपयोग करना Module.register_attribute/3 (http://elixir-lang.org/docs/stable/elixir/Module.html#register_attribute/3) और विशेष रूप से accumulate: true विकल्प के साथ साथ, उन्हें और अधिक मायनों में उपयोगी बनाता है।

मैं जो कहना चाहता हूं वह यह है कि वे केवल स्थिर के रूप में उपयोग किए जाने से अधिक उपयोगी हो सकते हैं।

+0

हम्म। आईएमओ जो बहुत कमजोर कारण की तरह लगता है। मुझे मॉड्यूल विशेषताओं के किसी भी अन्य उपयोग को तब नहीं दिखता है (दस्तावेज़, टैग इत्यादि को छोड़कर ...) – Sheharyar

+1

एलिक्सीर प्लग लाइब्रेरी 'संचित: सत्य' के साथ मॉड्यूल विशेषताओं का उपयोग करने का एक अच्छा उदाहरण है। यदि आप स्रोत में अधिक खोदना चाहते हैं तो यहां एक लिंक है https://github.com/elixir-lang/plug/blob/19f53a67e672152a7393611681431c1e0ec1be04/lib/plug/builder.ex#L121 – ventsislaf

4

use और मैक्रोज़ का उपयोग करके "धोखाधड़ी" का एक तरीका है। this example पर देखें।

defmodule AwesomeLibrary do 
    defmacro __using__(_) do 
    quote do 
     def print(s), do: IO.puts(s) 
    end 
    end 
end 

फिर, कुछ मॉड्यूल में आप use कीवर्ड इस तरह से उपयोग कर सकते हैं:

उदाहरण के लिए आप के रूप में एक मॉड्यूल को परिभाषित लगता है।

defmodule TestLibrary do 
    use AwesomeLibrary 
end 

प्रभाव है कि सब कुछ __using__ ब्लॉक में परिभाषित संकलन समय पर नया मॉड्यूल में नकल कर रहा है। तो, उस स्थिति में, आप TestLibrary.print का उपयोग कर सकते हैं भले ही print किसी अन्य मॉड्यूल में परिभाषित किया गया हो।

इसका उपयोग निरंतर प्रतिलिपि बनाने के लिए भी किया जाता है। एक उदाहरण के रूप में आप टाइमएक्स लाइब्रेरी को देख सकते हैं। यह a dedicated module for constants का उपयोग करता है जिसे जब भी आवश्यक हो तब आयात किया जाता है।

यह मुझे एक बड़े कोडबेस के आसपास स्थिरांक परिभाषाओं को साझा करने का अच्छा तरीका प्रतीत होता है।

+1

यह टाइमएक्स में एक शानदार लिंक है। यह भी है कि मैं उनका उपयोग कैसे कर रहा हूं। मैंने परियोजनाओं में "स्थिरांक" साझा करने के विभिन्न तरीकों को देखने के लिए एक अवधारणा ऐप बनाया: https://github.com/bill-mybiz/elixir-constants-concept। मैंने स्थिरांक ("अभी समीक्षा में") पर एक SO "दस्तावेज़ीकरण" भी बनाया है, क्योंकि यह कुछ क्षेत्रों में से एक है, इलीक्सिर का दस्तावेज इतना मजबूत नहीं है। (बस बाकी सब कुछ शानदार ढंग से दस्तावेज किया गया है)। इस विधि का एक अन्य लाभ यह है कि आप उन्हें गार्ड स्टेटमेंट्स के अंदर उपयोग कर सकते हैं (क्योंकि यह संकलन-समय है)। – ibgib

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