2017-02-16 11 views
8

के बीच अंतर यह मेरे जैसा ही प्रतीत होता है। चूंकि TypeDataType प्रकार है और इसके विपरीत, वे बराबर नहीं हैं? मुझे एक बनाम दूसरे का उपयोग कब करना चाहिए?जूलिया: टाइप और डेटा टाइप

> isa(DataType, Type) 
true 

> typeof(Type) 
DataType 

> isa(Type, DataType) 
true 

> typeof(DataType) 
DataType 

उत्तर

6

Type और DataType खुद को दोनों प्रकार के होते हैं। और अधिकांश प्रकारों का प्रकार है, जैसा कि आपने पाया है, DataType। - जूलिया में इतने प्रकार isa दोनों हैं

julia> supertype(DataType) 
Type{T} 

julia> supertype(Type) 
Any 

julia> DataType <: Type 
true 

इसका मतलब यह है कुछ भी है कि isaDataType भी एक Type हो जाएगा कि: इस मामले में, DataType सार Type की एक उप-प्रकार है। Type के अन्य उपप्रकार भी हैं, जिनमें Union एस और TypeConstructor एस शामिल हैं। इसका मतलब है कि जूलिया में सभी प्रकार Type प्रकार होंगे, लेकिन Vector जैसी साधारण चीजें DataType प्रकार की नहीं होंगी।

Type विशेष है। जैसा कि आप ऊपर देखते हैं, यह पैरामीट्रिक है। यह आपको प्रश्न में एक विशिष्ट प्रकार के प्रकार को सटीक रूप से निर्दिष्ट करने की अनुमति देता है। इसलिए जब जूलिया isaType में हर प्रकार, केवल IntisaType{Int}:

julia> isa(Int, Type{Int}) 
true 

julia> isa(Float64, Type{Int}) 
false 

julia> isa(Float64, Type) 
true 

इस क्षमता विशेष और Type के लिए अद्वितीय है, और यह प्रेषण एक विशिष्ट प्रकार पर निर्दिष्ट किया जा करने के लिए अनुमति में आवश्यक है। उदाहरण के लिए, कई फ़ंक्शंस आपको अपने पहले तर्क के रूप में एक प्रकार निर्दिष्ट करने की अनुमति देते हैं।

f(x::Type{String}) = "string method, got $x" 
f(x::Type{Number}) = "number method, got $x" 

julia> f(String) 
"string method, got String" 

julia> f(Number) 
"number method, got Number" 

कि Type{Number}केवल, Number के प्रकार, और नहीं Int के प्रकार है भी Int <: Number हालांकि यह ध्यान देने योग्य है! यह पैरामीट्रिक invariance है। एक विशेष सार प्रकार के सभी उप-प्रकारों, आप एक समारोह पैरामीटर का उपयोग कर सकते हैं की अनुमति देना:

julia> f(Int) 
ERROR: MethodError: no method matching f(::Type{Int64}) 

julia> f{T<:Integer}(::Type{T}) = "integer method, got $T" 
f (generic function with 3 methods) 

julia> f(Int) 
"integer method, got Int64" 

प्रश्न में विशिष्ट प्रकार के कब्जा करने के लिए एक समारोह पैरामीटर के रूप में शक्तिशाली और अक्सर इस्तेमाल किया है की क्षमता। ध्यान दें कि मुझे तर्क नाम निर्दिष्ट करने की भी आवश्यकता नहीं है - इस मामले में महत्वपूर्ण एकमात्र चीज Type{} के भीतर पैरामीटर है।


तो है कि क्या वास्तव में एक बहुत संक्षिप्त उत्तर है के लिए एक सुंदर लंबे विवरण था: आप आम तौर पर, DataType का उपयोग करने के बाद से यह जूलिया में सभी प्रकार के कवर नहीं किया जाएगा नहीं करना चाहती। इसके बजाय आपको किसी भी या सभी प्रकार के प्रकार का वर्णन करने के लिए Type का उपयोग करना चाहिए। Type{T} का उपयोग करें जब आप विशेष रूप से T के प्रकार का वर्णन करना चाहते हैं।

+0

'टाइपटाइप' को अधिकांश उपयोग मामलों के लिए 'डेटाटाइप' को प्राथमिकता दी जानी चाहिए, क्योंकि 'डेटा टाइप' में केवल कुछ प्रकार जैसे 'स्ट्रिंग' या 'नंबर' शामिल हैं, लेकिन' वेक्टर 'या' यूनियन {Int, Float64} 'नहीं है। –

+0

ओपी के सवाल का अधिक जवाब देने के लिए, जबकि कई प्रकार 'डेटा टाइप' हैं, सभी नहीं हैं। सभी प्रकार 'टाइप 'हैं। V0.5 पर 'टाइप' के ठोस उपप्रकार' डेटा टाइप ',' टाइपकॉन्स्ट्रक्टर 'और' यूनियन 'हैं; 0.6 पर यह सूची 'डेटाटाइप', 'BottomType', 'Union', और' UnionAll' है। –

+0

आह, ठीक है। सुधारों के लिए धन्यवाद। जब मुझे मौका मिलता है तो मैं इसे संपादित कर दूंगा। –

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