2010-12-19 15 views
6

मैं इस सरल स्कैला कोड में इंटरऑप करने का प्रयास कर रहा हूं, लेकिन मुझे कुछ परेशानी हो रही है।क्लोजर/स्कैला इंटरऑप?

package indicators 

class DoubleRingBuffer(val capacity:Int=1000) { 
    var elements = new Array[Double](capacity); 
    private var head=capacity-1 
    private var max=0 

    def size():Int = { 
    return max+1 
    } 

    def add(obj:Double):Double = { 
    head-=1 
    if (head<0) head=capacity-1 
    return set(max+1,obj) 
    } 

    def set(i:Int,obj:Double):Double = { 
    System.out.println("HI") 
    if (i>=capacity || i<0) 
     throw new IndexOutOfBoundsException(i+" out of bounds") 
    if (i>=max) max=i 
    var index = (head+i)%capacity 
    var prev = elements(index) 
    elements(index)=obj 
    return prev 
    } 

    def get(i:Int=0):Double = { 
    System.out.println("size is "+size()) 
    if (i>=size() || i<0) 
     throw new IndexOutOfBoundsException(i+" out of bounds") 
    var index = (head+i)%capacity 
    return elements(index) 
    }  
} 

clojure में, मैं करता हूँ इस

(import 'indicators.DoubleRingBuffer) 
(def b (DoubleRingBuffer. 100)) 
(pr (.size b)) ;;ERROR: No matching field found: size for class indicators.DoubleRingBuffer 
(pr (.get b 33)) ;;returns 0: should throw an index out of bounds error! 
(pr (.get b 100)) ;;throws index out of bounds error, as it should 

इसके अलावा, मैं कंसोल के लिए किसी भी उत्पादन नहीं मिलता है! अपेक्षा के अनुसार स्कैला कार्यों का उपयोग करके इस कोड का परीक्षण करना। यहां क्या चल रहा है और मैं इसे कैसे ठीक कर सकता हूं ताकि क्लोजर स्कैला कोड का उपयोग कर सके?

उत्तर

9

आरईपीएल में इन का प्रयास करें:

(class b) शायद आपको बता देंगे यह indicators.DoubleRingBuffer है।

(vec (.getDeclaredMethods (class b))) आपको अपनी कक्षा में घोषित सभी विधियों का एक वेक्टर देगा जैसे कि यह जावा क्लास था, ताकि आप उनके हस्ताक्षर देख सकें।

अब, इन विधियों के नाम और पैरामीटर के साथ हस्ताक्षर में दिखाई देने वाली विधियों को कॉल करें।

मुझे लगता है कि स्काला में विधि पैरामीटर के लिए डिफ़ॉल्ट मान से निपटने में समस्या है।

संपादित करें: ओपी के रूप में एक टिप्पणी में वर्णित है, यह नहीं है।

यदि यह काम नहीं करता है तो आप DoubleRingBuffer वर्ग की तरह दिखने के लिए जावा पर अपने स्कैला बाइटकोड को डिकंपाइल करने का प्रयास कर सकते हैं।

+0

धन्यवाद! डिकंपलिंग ने चाल बनाई - जावा कोड सही था, इसलिए अंत में यह मेरे बढ़ते निर्माण उपकरण के साथ कुछ अजीब बग था - फिर से शुरू हुआ और यह उम्मीद के अनुसार काम किया! बीटीडब्ल्यू, मैंने http://java.decompiler.free.fr/, महान उपकरण का उपयोग किया। – josh

+1

@josh: आप 'स्केलैक -प्रिंट' भी आज़मा सकते हैं जो एक "विलुप्त" संस्करण मुद्रित करेगा जो अभी भी स्कैला सिंटैक्स है, लेकिन जावा के लिए आइसोमोर्फिक है, यानी सभी उन्नत स्कैला सुविधाओं को हटा दिया गया है। इसके अलावा, 'स्केलप' है जो 'जावप', यानी डीकंपाइल '.class' फ़ाइलों की तरह काम करता है। –

+0

@josh: यह सुनकर खुशी हुई! –

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