2013-04-30 5 views
6

मैं एक स्कैला नौसिखिया हूँ। मैंने कुछ किताबों के माध्यम से उगाया है, और कुछ ऑनलाइन ट्यूटोरियल पढ़ा है। मेरी पहली परियोजना में समस्याएं आ रही हैं, इसलिए मैंने कोड को सबसे सरल चीज़ में कम कर दिया है जो गलत हो सकता है।varargs के साथ स्कैला में रचनाकार

मैंने स्केल/कन्स्ट्रक्टर/varargs के लिए Google और स्टैक ओवरफ़्लो खोजा है, और स्कैला के कुछ पर्यटन पढ़े हैं।

(लगभग) सबसे सरल कोड है:

class Foo(val params: Int*) 
case class Foo1(val p: Int) extends Foo(p) 
case class Foo2(val p1: Int, val p2: Int) extends Foo(p1, p2) 

object Demo extends App { 
    override def main(args: Array[String]) { 
    val f = Foo2(1, 2) 
    f.p1 
    } 
} 

अपवाद तब होता है जब तक पहुँचने p1 और है

सूत्र में अपवाद "मुख्य" java.lang.ClassCastException: scala.collection.mutable.WrappedArray $ ofInt java.lang.Integer

ग्रहण का उपयोग कर डिबगिंग का सहारा में ढाला नहीं जा सकता है, मैं एक दिलचस्प संपत्ति पाया: जब चर को देख

f Foo2 (id=23) 
    p2 2 
    params WrappedArray$ofInt (id=33) 
     array (id=81)  
      [0] 1 
      [1] 2 

तो पी 1 के साथ क्या हुआ?

मैं एक नौसिखिया सवाल के साथ आप परेशान करने के लिए माफी चाहता हूँ

उत्तर

6

उत्तर देना चाहिए तुम गलत नहीं हैं, लेकिन संकलक है। यह p1p से बाहर निकलने की कोशिश करता है (आपके मामले में यह Foo2.p1Foo.params से बाहर निकलने की कोशिश करेंगे):

def p1(): Int = scala.Int.unbox(Main$$anon$1$B.super.p()); 

जो स्पष्ट रूप से एक बग है क्योंकि यह काम नहीं कर सकता है। इसके बजाय इसे उपclass के ctor में p1 असाइन करना चाहिए।

मैंने एक बग की सूचना दी: SI-7436

+0

वाट चलाता है। मेरा पहला स्कैला बग। ठीक है धन्यवाद। मेरे पास एक काम है, लेकिन मैं मदद की सराहना करता हूं। इसने मुझे फोरट्रान समकक्ष ब्लॉक, या पास्कल संस्करण रिकॉर्ड की याद दिला दी। –

+0

बीटीडब्ल्यू, 'कक्षा एक्स (वैल पी: इंट *)' ज्यादा समझ में नहीं आता है। 'दसवीं कक्षा (वैल पी: Seq [इंट])' या 'दसवीं कक्षा (पी: इंट *) {def पैरामीटर आप एक्स के निर्माण के बाद' p' के लिए उपयोग करना चाहते हैं तो बस varargs के बजाय एक दृश्य का उपयोग करें: सेक [Int] = p} '। – sschaef

1

मैं तुम्हें करने के लिए व्याख्या नहीं कर सकते/क्यों/स्काला भ्रमित हो जाता है, लेकिन निम्न काम करता है:

class Foo(p: Int, ps: Int*) 
case class Foo1(p1: Int) extends Foo(p1) 
case class Foo2(p1: Int, p2: Int) extends Foo(p1, p2) 

object Main extends App { 
    println(Foo1(1)) 
    println(Foo2(2, 3)) 
} 

भी ध्यान रखें कि, जब App का विस्तार , आप main ओवरराइड नहीं करना चाहेंगे।

+0

मैं ऐप पर टिप्पणी की सराहना करता हूं। मैं एक नौसिखिया हूँ, इसलिए मैंने अभी ग्रहण में हैलो वर्ल्ड उदाहरण का उपयोग किया। कामकाजी कोड के लिए धन्यवाद। मेरे पास सूचियों का उपयोग करने वाला कुछ है जो काम करता है: मेरी समस्या समझ में से एक है। दुर्भाग्यवश मुझे कोड की "पठनीयता" के बारे में बहुत परेशान है, और परिवर्तनीय पैराम का इरादा सभी पैरा को पकड़ना है। मुझे आश्चर्य है कि यह एक स्कैला बग है –

+0

अपनी टिप्पणी पढ़ने के बाद मुझे लगता है कि मुझे यह उल्लेख करना चाहिए था कि उपर्युक्त कोड आपके उदाहरण के अर्थशास्त्र को भी बदलता है क्योंकि 'फू' के कन्स्ट्रक्टर को अब कम से कम एक तर्क की आवश्यकता है। शायद कोई बड़ी बात नहीं है लेकिन यह समस्या डोमेन पर निर्भर करता है :) – fotNelton

0

आप this comment पर एक नज़र और बस के ऊपर जवाब होना चाहिए, मुझे लगता है कि आपकी समस्या ;-)

+0

प्रतिक्रिया के लिए धन्यवाद। मैंने प्रश्न पोस्ट करने से पहले मैंने इसे देखा, लेकिन मुझे नहीं लगता कि यह सही जवाब है। उस सवाल में व्यक्ति कन्स्ट्रक्टर को किसी भी * पैरा को पास करना चाहता था। मैं ऐसा नहीं करना चाहता। Foo2 के मामले में मैं किसी भी * को पास कर रहा हूं (पी 1, पी 2), और कुछ विचित्र कारणों से यह परिवर्तनीय पी 1 तक पहुंच खो रहा है, और इसे पैरा के लिए कॉल के साथ बदल रहा है, फिर कक्षा कास्ट किया जा रहा है। ध्यान दें कि प्रश्न में व्यक्ति को संकलन करने के लिए कोड नहीं मिल सका। मेरा संकलन और –

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