मैं अपनी फ़ंक्शन परिभाषा में फ़ंक्शन पैरामीटर के उप-प्रकार का उपयोग करना चाहता हूं। क्या यह संभव है?क्या मैं फ़ंक्शन परिभाषा में फ़ंक्शन पैरामीटर के उप प्रकार का उपयोग कर सकता हूं?
g{T1, T2<:T1}(x::T1, y::T2) = x + y
ताकि g
किसी भी x::T1
के लिए परिभाषित किया जाएगा और किसी भी y
T1
की एक उप-प्रकार है: उदाहरण के लिए, मैं की तरह कुछ लिखने के लिए करना चाहते हैं। जाहिर है, अगर मुझे पता था, उदाहरण के लिए, T1
हमेशा Number
होगा, तो मैं g{T<:Number}(x::Number, y::T) = x + y
लिख सकता हूं और यह ठीक काम करेगा। लेकिन यह सवाल उन मामलों के लिए है जहां T1
रन-टाइम तक ज्ञात नहीं है।
पर पढ़ें आप सोच रहे हैं कि कारण है कि मैं ऐसा करना चाहते हैं:
मैं क्या थोड़ा बोझिल होगा करने के लिए कोशिश कर रहा हूँ, लेकिन क्या इस प्रकार एक सरल उदाहरण है का पूरा विवरण। के रूप में
abstract MyAbstract
type MyType <: MyAbstract ; end
मैं बनाने के इस प्रकार एक सार सुपर-प्रकार परिभाषित के साथ,
type MyVectorType{T}
x::Vector{T}
end
f1!{T}(m::MyVectorType{T}, xNew::T) = (m.x[1] = xNew)
मैं भी एक और प्रकार है:
मैं एक parameterised प्रकार है, और एक सरल विधि है कि प्रकार पर परिभाषित वेक्टर तत्व प्रकार के साथ MyVectorType
का उदाहरण MyAbstract
पर सेट किया गया:
m1 = MyVectorType(Array(MyAbstract, 1))
अब मैं में MyType
का उदाहरण देना चाहता हूं। मैं यह कर सकता हूं, MyType <: MyAbstract
के बाद से। हालांकि, मैं f1!
के साथ ऐसा नहीं कर सकता, क्योंकि फ़ंक्शन परिभाषा का अर्थ है कि xNew
T
प्रकार का होना चाहिए, और T
MyAbstract
होगा, MyType
नहीं।
दो समाधान मैं इस समस्या के बारे में सोच सकते हैं:
f2!(m::MyVectorType, xNew) = (m.x[1] = xNew)
f3!{T1, T2}(m::MyVectorType{T1}, xNew::T2) = T2 <: T1 ? (m.x[1] = xNew) : error("Oh dear!")
पहले अनिवार्य रूप से एक बतख टाइपिंग समाधान है। दूसरा चरण में उचित त्रुटि जांच करता है।
कौन सा पसंदीदा है? या क्या कोई तीसरा, बेहतर समाधान है जिसके बारे में मुझे पता नहीं है?
बहुत उपयोगी उत्तर - मैंने बहुत कुछ सीखा। बहुत धन्यवाद। –