Я пытаюсь вмешаться в этот простой код scala, но у меня есть некоторые проблемы.
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
Кроме того, я не получаю никакого вывода на консоль! Тестирование этого кода с помощью scala работает так, как ожидалось. Что происходит здесь и как я могу его исправить, чтобы clojure мог использовать код scala?
Попробуйте в REPL:
(class b)
, вероятно, расскажет вам об этом indicators.DoubleRingBuffer
.
(vec (.getDeclaredMethods (class b)))
даст вам вектор всех методов, объявленных в вашем классе, как если бы это был класс Java, поэтому вы можете видеть их подписи.
Теперь вызовите свои методы, как показано в подписях, с этими именами и параметрами метода.
У меня такое чувство, что проблема в Scala связана со значением по умолчанию для параметра метода.
EDIT: как описано в комментарии, OP это не так.
Если это не сработает, вы можете попытаться декомпилировать байт-код Scala на Java, чтобы узнать, как выглядит класс DoubleRingBuffer
.
scalac -print
который выведет «десагаредную» версию, которая по-прежнему остается синтаксисом Scala, но изоморфна Java, т. е. со всеми удаленными расширенными функциями Scala. Также естьscalap
который работает какjavap
, то есть декомпилирует.class
.