2013-04-23 5 views
6

स्कैला संकलक को नीचे दिए गए बयान के लिए चेतावनियां उत्पन्न करनी चाहिए, लेकिन ऐसा नहीं है। क्यूं कर?स्कैला कंपाइलर क्यों चेतावनी उत्पन्न करता है कि क्या बयान हमेशा पैटर्न पैटर्न के अंदर झूठा उत्पन्न करते हैं?

sealed trait T 
object A extends T 

val s:Seq[T] = Seq(A) 

val result = s.map { 
    //This if should produce a compiler warning 
    case a if(a == "A") => 
     "First" 
    case a => 
     //This if should produce a compiler warning 
     if (a == "A") { 
     "Second" 
     } 
     else 
     { 
     "Third" 
     } 
} 

परिणाम आपकी अपेक्षानुसार हो जाएगा "तीसरा", लेकिन संकलक case a if(a == "A") पर और if (a == "A") पर एक चेतावनी उत्पन्न हो जाना चाहिए था, लेकिन अफसोस कोई चेतावनी है।

अगर मैं निम्नलिखित कोड लिखने यह बर्ताव करता है जैसे मैं उम्मीद करेंगे:

if(A == "A"){ 
    println("can't happen") 
} 

// warning: comparing values of types A.type and String using `==' will always yield false 

हो रहा क्यों है?

संपादित करें: मैं स्कैला 2.10.1 का उपयोग कर रहा हूं।

+0

मुझे विश्वास है कि जब आप पैटर्न मिलान का उपयोग, आप प्रत्येक मामले के लिए प्रकार निर्दिष्ट करने की आवश्यकता है, अन्यथा आप कुछ भी भरपाई कर देंगे। इसे "केस ए: ए अगर (ए ==" ए ") => ..." में बदलने की कोशिश करें। – Felix

+0

मैंने इसे 'केस ए के साथ करने की कोशिश की: टी अगर (ए == "ए") => 'और अभी भी कोई चेतावनी नहीं है। – coltfred

उत्तर

1

क्योंकि ऐसा हो सकता है। अगर मैंने बस कुछ आंतरिक राज्य रखा और पहले और दूसरे कॉल पर == "ए" के लिए अलग-अलग परिणाम लौटाए, तो मुझे "दूसरा" मिल सकता है।

आपने ए की परिभाषा प्रदान की है जो गारंटी देता है कि ऐसा नहीं हो सकता है, लेकिन इसके लिए पूरे कार्यक्रम की जांच की आवश्यकता है, और कंपाइलर चेतावनियां केवल स्थानीय हैं।

+1

मुझे यकीन नहीं है कि मैं आपका जवाब समझता हूं। अगर मैं अपने कोड में कहीं भी 'अगर (ए == "ए") {} 'अभिव्यक्ति लिखता हूं तो मुझे संकलक चेतावनी मिलती है, लेकिन आप कह रहे हैं कि किसी भी तरह से पैटर्न मैच घोषणा की स्थिति को स्थानीय बनाता है? कृपया स्पष्ट करें। – coltfred

0

आप स्ट्रिंग तर्क के साथ अतिभारित == विधि के साथ वर्ग विरासत में मिला दिया जाएगा मई ...

+0

यह सच है, लेकिन संकलक उस जानकारी को जानता है। मैंने जोश सुएरेथ के साथ इस पर चर्चा की जो टाइपएफ़ पर काम करता है और उसका जवाब निम्न था "संकलक उत्पन्न नहीं करने वाला संकलक एक बग नहीं है, लेकिन हम चाहते हैं कि चेतावनी अधिक मजबूत हो।" तो जब यह एक "बग" नहीं है, यह लागू नहीं किया गया है। – coltfred

+0

तो, मुझे उम्मीद है कि हम भविष्य में स्कैला संकलक रिलीज में इस चेतावनी को देख पाएंगे :) – aeracode

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