2012-04-04 7 views
5

मैं इस मुद्दे को समझने की कोशिश कर रहा हूं, और मैंने स्कैला पर पढ़ी विभिन्न शैलियों की कोशिश की, लेकिन उनमें से कोई भी काम नहीं करता है। मेरे कोड है:मेरा स्कैला फ़ंक्शन रिटर्निंग यूनिट क्यों है और अंतिम पंक्ति जो भी नहीं है?

.... 

val str = "(and x y)"; 

def stringParse (exp: String, pos: Int, expreshHolder: ArrayBuffer[String], follow: Int) 

    var b = pos; //position of where in the expression String I am currently in 
    val temp = expreshHolder; //holder of expressions without parens 
    var arrayCounter = follow; //just counts to make sure an empty spot in the array is there to put in the strings 

    if(exp(b) == '(') { 
     b = b + 1; 

     while(exp(b) == ' '){b = b + 1} //point of this is to just skip any spaces between paren and start of expression type 

     if(exp(b) == 'a') { 
       temp(arrayCounter) = exp(b).toString; 
       b = b+1; 
       temp(arrayCounter)+exp(b).toString; b = b+1; 
       temp(arrayCounter) + exp(b).toString; arrayCounter+=1} 
       temp; 

     } 

} 

val hold: ArrayBuffer[String] = stringParse(str, 0, new ArrayBuffer[String], 0); 
for(test <- hold) println(test); 

मेरे त्रुटि है:

Driver.scala:35: error: type mismatch; 
found : Unit 
required: scala.collection.mutable.ArrayBuffer[String] 
ho = stringParse(str, 0, ho, 0); 
       ^one error found 

जब मैं एक विधि घोषणा में बहस के बाद बराबर के चिह्न है, तो तरह जोड़ें:

def stringParse (exp: String, pos: Int, expreshHolder: ArrayBuffer[String], follow: Int) ={....} 

यह करने के लिए यह परिवर्तन "कोई"। मैं उलझन में हूं कि यह कैसे काम करता है। कोई विचार? बहुत सराहना की।

+1

+1 किसी नए चीज़ के लिए हमेशा सामना करना पड़ेगा। स्पष्टीकरण भी थोड़ा सा प्रतिद्वंद्वी है। – aitchnyu

उत्तर

8

यदि आप कोई मान वापस करना चाहते हैं तो आपको बराबर चिह्न जोड़ना होगा। अब, आपके फ़ंक्शन का रिटर्न मान कोई कारण यह है कि आपके पास 2 नियंत्रण पथ हैं, प्रत्येक एक अलग प्रकार के मान को वापस लौटाता है - 1 तब होता है जब if की स्थिति पूरी हो जाती है (और वापसी मूल्य अस्थायी होगा) और दूसरा तब होता है जब दूसरा अगर स्थिति नहीं है (और वापसी मूल्य बी = बी + 1 होगा, या इसके बढ़ने के बाद बी)।

+0

यदि वापसी नहीं हुई है तो वापसी मूल्य बी = बी + 1 क्यों होगा? लेकिन मैं देखता हूं कि आपका क्या मतलब है। जावा में यह ऐसा नहीं है, इसलिए यह अजीब लगता है कि स्कैला में अन्य मामले शामिल हैं। – Andy

+0

बी = बी + 1 के बारे में कभी भी ध्यान न दें। यह समझ आता है। मैंने इसे अलग-अलग स्वरूपित किया, इसलिए जब मैंने इसे अपने संपादक में देखा तो यह समझ में आया। मुझे सही दिशा बताने के लिए धन्यवाद! – Andy

+0

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

9

यहाँ कैसे एक इस तरह की समस्याओं से संपर्क कर सकते हैं पर एक अधिक सामान्य जवाब है:

यह कभी कभी ऐसा होता है कि आप अपने सिर में एक समारोह और बारे में मान यह प्रकार X दिखाए, लेकिन कहीं न कहीं सड़क के नीचे संकलक सहमत नहीं हैं। यह लगभग हमेशा होता है जब फ़ंक्शन अभी लिखा गया है, इसलिए जब संकलक आपको वास्तविक स्रोत नहीं देता है (यह उस रेखा को इंगित करता है जहां आपके फ़ंक्शन को इसके बजाए कहा जाता है) आप आमतौर पर जानते हैं कि आपके फ़ंक्शन का रिटर्न प्रकार समस्या है।

यदि आपको सीधे प्रकार की समस्या दिखाई नहीं देती है, तो आपके फ़ंक्शन को स्पष्ट रूप से टाइप करने के लिए सरल चाल है। उदाहरण के लिए, यदि आपने सोचा था कि आपका फ़ंक्शन Int वापस लौटा होना चाहिए था, लेकिन किसी भी तरह संकलक कहता है कि इसे Unit मिला है, तो यह आपके फ़ंक्शन में : Int जोड़ने में मदद करता है। इस तरह, आप कंपाइलर की मदद करने में आपकी सहायता करते हैं, क्योंकि यह सटीक स्थान को स्थान देगा, जहां आपके फ़ंक्शन में कोई पथ गैर-Int मान देता है, जो वास्तविक समस्या है जिसे आप पहली जगह ढूंढ रहे थे।

+0

धन्यवाद। हाँ, मैंने कोशिश की, लेकिन यह अभी भी मुझे त्रुटि दी। मुझे लगता है कि शायद एक समस्या हो सकती है, लेकिन कम से कम मेरी समस्या के लिए इसे हल नहीं किया। अन्य परिस्थितियों के संदर्भ में जो निश्चित रूप से मददगार होंगे। मैं भाषा में नया हूं और मैं इनपुट की सराहना करता हूं। – Andy

0
class Test(condition: Boolean) { 

    def mixed = condition match { 
    case true => "Hi" 
    case false => 100 
    } 

    def same = condition match { 
    case true => List(1,2,3) 
    case false => List(4,5,6) 
    } 

    case class Foo(x: Int) 
    case class Bar(x: Int) 

    def parent = condition match { 
    case true => Foo(1) 
    case false => Bar(1) 
    } 
} 
val test = new Test(true) 

test.mixed // type: Any 
test.same // type List[Int] 
test.parent // type is Product, the case class super type 

संकलक (, अगर/बाकी, गुना, आदि मैच) सबसे विशिष्ट प्रकार यह परिणाम प्रकार के संभावित सेट के आधार पर कर सकते हैं सशर्त से लौटे लागू करने के लिए अपनी पूरी कोशिश करेंगे।

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