2010-12-19 17 views
6

Bu basit scala kodunda birlikte çalışmayı deniyorum, ancak bazı sıkıntılarım var. Clojure içindeclojure/scala interop?

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) 
    }  
} 

, ben bu

(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 

Ek olarak, i konsola herhangi bir çıktı alamadım yapmak! Bu kodu scala kullanarak sınama beklendiği gibi çalışır. Neler oluyor burada ve nasıl clojure scala kodunu kullanabilirim?

cevap

9

REPL bu deneyin:

(class b)

muhtemelen indicators.DoubleRingBuffer olduğunu söyleyecektir.

(vec (.getDeclaredMethods (class b))) size bir Java sınıfı sanki sizin sınıfta bildirilen tüm yöntemlerin bir vektör verecektir, bu yüzden onların imzalarını görebilirsiniz. Bu yöntem adları ve parametreleri ile, imzalar görüldüğü gibi

Şimdi, yöntemleri çağırmak.

İçimden bir ses problemi yöntemi parametresi için varsayılan değerle Scala'nın ilişkilerde olduğunu var.

DÜZENLEME: OP yorumunda açıklandığı gibi, öyle değil.

veya ağ erişimi gibi DoubleRingBuffer sınıf görünüm nasıl yaptığını öğrenmesi için Java için Scala bayt kodunu koda deneyebilirsiniz işe yaramazsa.

+0

Teşekkürler! Decompiling hile yaptı - java kodu mükemmel, bu yüzden sonunda benim incremental yapı aracı ile bazı garip böcek oldu - yeniden başlatıldı ve beklendiği gibi çalıştı! btw, http://java.decompiler.free.fr/, harika bir araç kullandım. – josh

+1

@josh: Ayrıca kaldırıldı özellikleri tüm gelişmiş Scala ile, Java 'yani scalać hala Scala sözdizimi bir "şekeri alınmış" sürümünü yazdırır -print' ama izomorf deneyebilirsiniz. Ayrıca 'javap', yani decompiles '.class' dosyaları gibi çalışan 'skalap' var. –

+0

@josh: İşe yaradığını duyduğuma sevindim! –

İlgili konular