2011-01-28 19 views
6

चेनिंग डॉट्स छोड़ना मुझे समझ नहीं आता क्यों निम्नलिखित कोड संकलन नहीं करता है:जब कॉल

class Abc 
{ 
    def b (x : String) = x + "abc" 

    def a (y : String) = 
    { 
     val ls : List[String] = y.lines toList 
     b (ls.head) 
    } 
} 

Main.scala: 8: त्रुटि: प्रकार मेल नहीं खाता; पाया: java.lang.String आवश्यक: इंट ख (ls.head)

जब मैं बदल "y.lines toList"

को
y.lines.toList 

या यहाँ तक कि

y.lines toList; 

को यह संकलित करता है।

शायद संकलक

(y.lines).toList(b (ls.head)) 

या ऐसा ही कुछ है जैसे कि यह समझता है, लेकिन मैं अभी भी नियम को नहीं समझते।

+0

आप आरईपीएल में अपने कथन '(y.lines) .toList (बी (ls.head)) ' (ठीक है, शायद आपने ऐसा किया?) को सत्यापित करने के लिए, यह सत्यापित करने के लिए कि त्रुटि गलत है। खैर - मैंने यह किया, और वास्तव में, यह है। :) –

+0

यही कारण है कि मुझे '; 'के बारे में सभी की चमक नहीं मिलती है। – Raphael

उत्तर

1

यह स्पष्ट नहीं है, और यह स्कैला के शॉर्टकट वाक्यविन्यास और सूची अनुक्रमण का संयोजन है। आप एक संकेत चाहते हैं, करने के लिए b को पुनर्परिभाषित करने का प्रयास करें:

def b(x : String) = 0 

आप कुछ अन्य संकलक कचरा वापस मिल जाएगा, लेकिन त्रुटि बदल जाएगा। संक्षेप में, स्कैला कंपाइलर आपको शून्य-या एक-पैरामीटर विधियों के लिए माता-पिता और बिंदुओं को छोड़ने देगा, और हम जानते हैं कि b ऐसा लगता है कि यह किसी भी तरह से जंजीर हो रहा है .. रगड़ यह है कि स्कैला भी सूची अनुक्रमण के लिए अभिभावकों का उपयोग करता है, इसलिए toList, एक इटरेटर लौटाता है, सूची सूचकांक के रूप में एक पैरामीटर ले सकता है। मुझे इस भाग के बारे में बिल्कुल यकीन नहीं है, लेकिन ऐसा लगता है कि एक बार जब आप डॉट्स छोड़ना शुरू कर देते हैं, तो लेक्सर लालची हो जाएगा, और जब यह एक पैरामीटर ले सकता है, तो यह अगले कथन को पास करने का प्रयास करेगा। इस मामले में, यह एक स्ट्रिंग है, इसलिए यह एक वाक्यविन्यास त्रुटि फेंकता है।

(y.lines).toList(b (ls.head)) 

ही संभव सुधार किया जा रहा है के साथ:

(y.lines).toList(b).apply(ls.head) 

मुझे यकीन है कि स्काला इस विशेष मामले में तय करेगा नहीं कर रहा हूँ

1

आप इसे इस के साथ स्थान पर मिला है।

नियम, लगभग बोल रहा है, object (method parameters)* [method] है। संकलक तब तक जारी रहेगा जब तक कि यह वैध अभिव्यक्ति के लिए टोकन पाता है। ; अभिव्यक्ति को समाप्त करता है, और इसलिए ) या } होगा। यदि अगली पंक्ति खाली है, अभिव्यक्ति भी समाप्त होती है। यदि अगली पंक्ति आरक्षित कीवर्ड (val, def, if, आदि) से शुरू होती है, तो अभिव्यक्ति भी समाप्त हो जाएगी।

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