Как написать открытое поле объекта Java в Clojure? - PullRequest
0 голосов
/ 14 сентября 2018

Этот вопрос отвечает, как читать открытое поле из объекта Java:

(let [p (java.awt.Point.)]
  (.x p))  ; <- returns 0

Я думал, что смогу написать поле аналогичным образом:

(let [p (java.awt.Point.)]
  (.x p 42))

Но я получаю следующую ошибку:

IllegalArgumentException No matching method found: x for class java.awt.Point
clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:53)

1 Ответ

0 голосов
/ 14 сентября 2018

Это описано в Clojure - Java Interop :

(set! (. instance-expr instanceFieldName-symbol) expr)

Специальная форма назначения.

Когда первый операнд является доступом к члену поляформа, присвоение соответствующему полю.Если это поле экземпляра, выражение expr будет оценено [и назначено соответствующему полю экземпляра].

Также обратите внимание на использование символа «-» при разрешении поля:

Если второй операнд [из (. instance-expr member)] равен символу, начинающемуся с -, символ-член будет разрешен только как доступ к полю (никогда не как метод 0-арности) и должно быть предпочтительным , когда это является намерением ... "

Таким образом:

(set! (. p -x) 42)

В качестве альтернативы " предпочтительные идиоматические формы для доступа к полю или методуmembers " немного отличается, и эта эквивалентность показана в раскрытии макроса в верхней части страницы.

(set! (.-x p) 42)
...