2015-04-30 4 views
11

में मतलब एसटीडी में अमृत पैकेज की तरहक्या करता है `@type टी ::% __ मॉड्यूल __ {}` अमृत

@type t :: %__MODULE__{} 

मुझे पता है कि @type एनोटेशन उर्फ ​​से कम अंकन करने के लिए प्रयोग किया जाता है लाइनों के एक बहुत देखते हैं @spec एनोटेशन में टाइप करें, लेकिन इस लाइन का उपयोग मॉड्यूल में किया जाता है जैसे कि uri.ex जिसमें @spec एनोटेशन नहीं हैं।

इस एनोटेशन का उद्देश्य क्या है?

उत्तर

20

सबसे पहले, @type निर्देश के साथ निर्दिष्ट प्रकार सार्वजनिक डिफ़ॉल्ट रूप से कर रहे हैं (जैसा कि @typep साथ प्रकार परिभाषित करने के खिलाफ)। इसका मतलब यह है कि भले ही एक मॉड्यूल में कोई चश्मा है, एक प्रकार को परिभाषित अन्य डेवलपर्स जब उनके कार्यों लेखन कि प्रकार का उपयोग करने की अनुमति देता है:

@doc "Computes the length of a URI." 
@spec foo(URI.t) :: non_neg_integer 
def foo(uri), do: # ... 

__MODULE__ एक विशेष रूप है कि एक परमाणु के रूप में वर्तमान मॉड्यूल का नाम लिए विस्तारित है (docs for it देखें), तो यह:

defmodule MyModule do 
    @type t :: %__MODULE__{} 
end 

एक MyModule.t प्रकार को परिभाषित करेगा। t प्रकार का सबसे आम उपयोग structs और प्रोटोकॉल का प्रतिनिधित्व करने के लिए है (उदा।, Enum.t)। यह पैटर्न बेहद आम है:

defmodule User do 
    defstruct [:name, :email] 
    @type t :: %__MODULE__{name: String.t, email: String.t} 
end 
+0

उस बारे में '@ typep' और' @ type'। '@ अपारदर्शी 'का अर्थ क्या है? मैंने सोचा कि यह एक प्रकार है जो निजी –

+1

@ क्रिजिज़्टोफेंडे '@ ओपेक' प्रकार सार्वजनिक हैं लेकिन वे प्रकार की आंतरिक संरचना को प्रकट नहीं करते हैं (उदाहरण के लिए, संरचना में फ़ील्ड सार्वजनिक नहीं हैं बल्कि संरचना के प्रकार है। '@ टाइपपी' प्रकार पूरी तरह से निजी हैं। क्या यह समझ में आता है? – whatyouhide

+0

यह करता है। आंशिक रूप से। क्यों उपयोग करने योग्य है लेकिन आंतरिक रूप से निरीक्षण योग्य नहीं है –

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