2016-03-01 15 views
5

में अमूर्त प्रकारों के ऐरे का उपयोग मैं जूलिया की खोज कर रहा हूं इसलिए मैं एक नौसिखिया हूं। अब मैं इसकी दृढ़ता से टाइप की गई विशेषताओं की खोज कर रहा हूं। जो मैं महसूस कर रहा हूं वह यह है कि मैं सरणी के लिए सार प्रकारों का उपयोग नहीं देख सकता। मुझे एक उदाहरण के साथ समझाएं:जूलिया

मान लें कि मैं एक ऐसा फ़ंक्शन बनाना चाहता हूं जो वास्तविकताओं के सरणी स्वीकार करता हो, चाहे उसका ठोस प्रकार चाहे। मैं का प्रयोग करेंगे:

function f(x::Array{Real}) 
    # do something 
end 

यह फ़ंक्शन f has no method matching f(::Array{Float64,1})

को ऊपर उठाने के बिना कभी नहीं कहा जा सकता है मैं कॉल करना चाहते हैं f([1,2,3]) या f([1.,2.,3.]) जब तक तत्व के प्रकार रियल है।

मैंने पढ़ा है कि आप सरणी को बढ़ावा या परिवर्तित कर सकते हैं (p.eg f(convert(Array{Real}, [1, 2, 3])) या तो) लेकिन मैं वास्तव में इस तरह से गैर गतिशील और थकाऊ देखता हूं।

क्या दृढ़ता से टाइप किए गए व्यवहार से छुटकारा पाने के बजाय कोई अन्य विकल्प है?

धन्यवाद। भी

typealias RealArray{T<:Real} Array{T} 
f(x::RealArray) = "do something with $x" 

और फिर आप गुमनाम कार्यों में typealias उपयोग कर सकते हैं,:

+5

आप एक पैरामीट्रिक फ़ंक्शन को परिभाषित कर सकते हैं: 'फ़ंक्शन f {टी <: असली} (x :: ऐरे {टी}) '। यह 'एफ ([1,2,3])' और 'एफ ([1., 2., 3।]) दोनों को कैप्चर करेगा। –

+0

बस @ user3580870 टिप्पणी में जोड़ना: पैरामीट्रिक कार्यों से जुड़े कोई प्रदर्शन जुर्माना नहीं है। यह जूलिया की एक बिल्कुल अभिन्न विशेषता है। –

+0

हां, आपकी टिप्पणी के लिए धन्यवाद, आप सही हैं। मैं इस विकल्प को "कठिन विकल्प" के रूप में जोड़ने वाला था, लेकिन आखिरकार मुझे खेद हुआ। यह समाधान मुझे संतुष्ट नहीं करता है क्योंकि इसका उपयोग अज्ञात कार्यों के लिए नहीं किया जा सकता है। – TheSorcerer

उत्तर

7

@user3580870 द्वारा समाधान पर विस्तार करने के लिए, आप भी एक typealias उपयोग कर सकते हैं समारोह परिभाषा थोड़ा और अधिक संक्षिप्त बनाने के लिए

g = (x::RealArray) -> "something else with $x" 
+0

निश्चित रूप से मेरे लिए यह सबसे अच्छा समाधान है। धन्यवाद :) – TheSorcerer