2015-03-13 16 views
5

कभी-कभी x को y के समान प्रकार के घोषित करने की इच्छा हो सकती है। vals प्रकार अनुमान इस तरह से संभालता है, लेकिन यह with function types जैसे कुछ अन्य क्षेत्रों में काम नहीं करता है।क्यों स्कैला में कोई गिरावट नहीं है?

कुछ समाधान जो कुछ सी ++ अनुभव वाले प्रोग्रामर के लिए स्पष्ट प्रतीत होता है वह decltype होगा। वर्तमान स्काला में ऐसी कोई सुविधा मौजूद नहीं है।

जुड़ा हुआ सवाल का उत्तर बताता है:

क्योंकि प्रकार प्रथम श्रेणी नागरिकों

मैं स्वीकार करने के लिए मुझे यह समझ में नहीं आता नहीं कर रहे हैं। मुझे नहीं लगता कि प्रकार सी ++ में प्रथम श्रेणी के नागरिक हैं, लेकिन फिर भी इसमें decltype हो सकता है। मैं जेनरिक में टाइप पैरामीटर के लिए decltype जैसे कुछ भी नहीं पूछ रहा हूं या ऐसा कुछ भी (मुझे लगता है कि जेनेरिक टेम्पलेट नहीं हैं और प्रकार उनमें मिटा दिए गए हैं)। फिर भी, मुझे लगता है कि एक ऑपरेटर जो मुझे एक प्रकार की अभिव्यक्ति का उपयोग करने की इजाजत देता है जहां एक प्रकार की अपेक्षा की जाती है - निश्चित रूप से संकलक एक अभिव्यक्ति प्रकार का मूल्यांकन करने में सक्षम होना चाहिए, अन्यथा val परिभाषा के लिए अनुमान टाइप करना संभव नहीं होगा।

एक decltype नीचे की तरह इस्तेमाल किया जा सकता है - कोड सिर्फ वाक्य रचना और मूल उपयोग वर्णन करने के लिए, कुछ भी कुछ भी उपयोगी करने के लिए कोशिश नहीं कर रहा है:

case class A(x:Int = 0) 

val a = new A(10) 
val b = new decltype(a) 

def f(c:decltype(a)) : decltype(a.x+a.x) 

, decltype के अभाव एक विचार निर्णय है या कर रहे हैं वहाँ कुछ विशिष्ट कारण क्यों स्कैला के पास नहीं हो सकता है? क्या संकलन समय प्रतिबिंब का उपयोग कर शायद कुछ समाधान है जो इसकी अनुमति देगा?

+0

कैसे 'b' खेलने में यहाँ आता है ? –

+0

@ m-z b यहां एक उदाहरण के रूप में है। इस विशेष मामले में यह वैल बी = ए जैसा ही होगा, लेकिन कोई भी ऐसे मामले की आसानी से कल्पना कर सकता है जहां यह वही नहीं होगा। मैं सवाल को अद्यतन करने की कोशिश करूंगा। – Suma

+0

मुझे प्रश्न समझ में नहीं आता है। प्रकार हस्ताक्षर समय संकलित कर रहे हैं, तो आप स्थिर रूप से प्रकार निर्दिष्ट करने में सक्षम होना चाहिए। फिर वह 'decltype' चीज़ आपको क्या देती है? नियमित 'वैल बी: ए = ए' और' डीफ़ एफ (सी: ए): ए' का "नुकसान" क्या है? –

उत्तर

1

मेरा पहला वार:

class Decl[T] { type Type = T } 
object Decl { def apply[T](x: T) = new Decl[T] } 

उदाहरण के लिए, अगर हम कुछ चर x जिसका प्रकार हम स्पष्ट रूप से यह नहीं करना चाहती है:

val d = Decl(x) 
type TypeOfX = d.Type 
+0

यह वास्तव में अच्छा है। यह एक दयालुता है जिसे कोई 'Decl (x) लिख नहीं सकता है। सीधे टाइप करें (या कम से कम मुझे कोई रास्ता नहीं मिला), लेकिन अभी भी अच्छा है, यह काम करता है। – Suma

+0

मुझे लगता है कि यह स्कैला में 'decltype' जैसे कुछ की अनुपस्थिति दिखाता है, यह संभवतः एक जानबूझकर निर्णय है। – Suma

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